最近在看aiohttp的源码,发现一种没有见过的定义函数写法def __enter__(self) -> None ,函数后面还跟着一个->,这让一个以前受过C指针伤害过的人来说整个人都不好了,于是查了一下这个带箭头的用法,这里的->的指针没有半毛钱关系。

这里的箭头其实是一种注解的写法,他是为了告诉调用者这个函数返回什么内容,如下面的代码

1
2
def test(x,y)->int:
return x+y

这告诉使用者,这个函数会返回一个int类型的值。
虽然在函数注解里虽然指定了返回一个int类型的值,但是我们知道在python 的返回值里可以返回任意类型的值,我们依然可以不按照注解来返回一个str类型的值

1
2
3
def test(x,y)->int:
r = x+y
return "yangyanxing"

这里写虽说不会报语法错误,可是谁看都会骂街,你既然告诉了你的使用者说你要返回一个int类型的值,可是你自己却给人家返回一个str类型的值,这都是不符合规范的。在使用pyCharm编辑器时,就会显示一个警告

Expected type ‘int’, got ‘str’ instead

对于函数的参数也可以使用注解

函数的参数也可以使用注解,用来告诉使用者需要传哪种类型的参数,方法是在参数后面加上一个冒号:

1
2
3
4
def test(x:int,y:int)->int:
return x+y

test(1,2)

同样还是那个问题,你可以约束,但是我也可以不遵守,你让我传一个int,我偏要传一个str,语法上不会报错,但是会报一个警告

注意上面的注解写法是在python3才有的,如果在python2下运行会报语法错误!