pycharm方法添加装饰器后,调用该方法IDE提示‘object‘ object is not callable,原因分析与解决

最近在学python, 遇到一个问题:有一个方法,我给它加上装饰器,在其他地方调用时,IDE自动检查会提示不可调用,但是执行没有报错,如下:

困扰好久,今天突然看到python文档typing —— 对类型提示的支持icon-default.png?t=N7T8https://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类型

最后感慨,工具、插件是好用,但还是要知道原理,不然出了错,根本不知道是什么引入的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值