后知后觉代价太高了;
当你走上不一样的路,你才能看到和别人不一样的风景;
参数注解是利用静态语言特性而生的;
总结:
- 标识符的类型:是看它赋什么值就是什么类型;
- 函数注解在变量意义不大,在函数中大量这样写;
Python是动态的、强类型的语言;
# py3.6版本才开始这样写;
a:int = 5
b:str = 6
这样的好处是有极大的灵活性,但坏处就是对于别人代码,无法一眼判断出参数的类型,IDE 也无法给出正确的提示。自己做判断写的代码比核心代码还要多;
于是 Python 3.5引入了函数参数注解 ;Python 3.6 引入了变量注解;
1. 函数注解
1.1 函数注解与变量注解:(只做声明)
变量就应该变,不应该做约束,但函数就不一样了;
函数是要求参数有类型要求,因为函数的返回值是有类型的,返回值和返回值的类型都非常重要;
函数注解:
1.不做强制性约束(颜色醒目);
2.根据变量的方法类型,可以猜出不知道功能的参数类型;
3.只对函数参数做一个辅助的说明,并不对函数参数进行类型检查;
4.注解提供给第三方工具,做代码分析,发现隐藏的bug;
5.函数注解的信息,保存在 annotations 属性中;
变量注解:
Python 3.6中才可以,注解在变量中的作用并不大;
1.2 动态编译型语言Python与静态编译型语言C\C++的差异:
- 动态编译型语言Python指定int类型,你输入其他类型,它也不吭声;(不报错的BUG)
- 静态编译型语言Java\C,指定int类型,你输入其他类型,会显示不支持;
- 动态编译型语言Python函数动态特性的弊端:难发现,难使用
1.3 注解定义:
def add(x:int, y:int) -> int:
return x+y
print(add(4,5))
print(add('mag','dsg'))
add.__annotations__
-----------------------------------------------------------
9
magdsg
{'x': int, 'y': int, 'return': int}
总结:
1.注解只做声明,相当于注释,不做强制性约束(颜色醒目):你可以不遵守,写来给第三方工具看的;
用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型;
2.函数参数类型检查
1.函数参数的检查,一定是在函数外;
2.函数应该作为参数,传入到检查函数中;
3.检查函数拿到函数传入的实际参数,与形参声明对比;
4._annotations_ 属性是一个字典,其中包括返回值类型的声明。假设要做未知参数的判断,无法和字典中的声明对应,使用inspect模块;
2.1 inspect模块
提供获取对象信息的函数,可以检查函数和类、类型检查;
inspect模块的使用
import inspect
def add(x:int, y:int):
x.append(5)
return x
print(inspect.isfunction(add)) # 判断函数类型;
sig = inspect.signature(add) # 拿到签名
print(sig)
params = sig.parameters # 拿到 函数参数列表;
print(params)
#利用参数注解查看变量的属性;
from inspect import Parameter
for i, (k,param) in enumerate(params.items()):
print(i,k,param)
# param:Parameter = 1 #利用参数注解查看变量的属性;
print(param.name, param.default, param.annotation, param.kind)
------------------------------------------------------------------------------
True
(x: int, y: int)
OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">)])
0 x x: int
x <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
1 y y: int
y <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
网友评论