最近在学python, 遇到一个问题:有一个方法,我给它加上装饰器,在其他地方调用时,IDE自动检查会提示不可调用,但是执行没有报错,如下:
困扰好久,今天突然看到python文档typing —— 对类型提示的支持https://docs.python.org/zh-cn/3/library/typing.html#
有所感悟:方法定义时可以标注入参和返回值的类型,一个简单的例子:
def fun_a(input: int) -> int:
return input * 2
定义一个方法,对一个整数乘2后返回,在定义的时候可以标注入参和返回值的类型。
这些可设置的标注的类型种类很多,详细可以参考上面说到的python文档。
回到开始遇到的问题,IDE提示的说object不可调用,说明这个不是一个方法,为什么加了装饰器之后就不是一个方法了呢?
我们知道装饰器本质是以方法为入参,重写的方法为返回值,那就可能是装饰器返回值的问题了。
去看装饰器的定义:
def get_time(f):
"""
耗时装饰器
:rtype: object
"""
def inner(*arg, **kwarg):
s_time = time.time()
res = f(*arg, **kwarg)
e_time = time.time()
print('方法:{} 耗时:{:0>4f}秒'.format(f.__name__, e_time - s_time))
return res
return inner
看上去很正常,return inner 也是返回的一个方法,并不是inner()
关键在方法注释里,pycharm提供了自动注释功能,默认有一行
:rtype: object
这行是指定return值类型是一个object
终于破案了,就是这个注释,让IDE认为装饰器返回值是一个object,而加了装饰器的方法返回值也是一个object,从而提示'object' object is not callable
解决方法:
1、删除注释那一行
2、显式的指定装饰器返回值为callable类型
最后感慨,工具、插件是好用,但还是要知道原理,不然出了错,根本不知道是什么引入的。