类中的装饰器在Pycharm中抛出警告

时间:2017-12-23 14:20:43

标签: python pycharm decorator python-3.6

我正在使用 PyCharm IDE ,下面是我正在使用装饰器的代码片段。装饰器基本上检查参数extract是否是整数> = 0。 尽管我注意到PyCharm中存在一些语法错误,但是这段代码正在工作。

class MyClass(object):    
    def _argument_test_extract(func):
        def _helper(*args, **kwargs):
            kwargs = inspect.getcallargs(func, *args, **kwargs)
            if 'rule' in kwargs:
                extract = kwargs['rule']['extract']
                if type(extract) == int and extract >= 0:
                    return func(**kwargs)
                else:
                    raise Exception("Argument `extract` is not an integer")
        return _helper

    @_argument_test_extract
    def _perform_split_model_string(self, rule):
        # do some stuff

PyCharm指示我使用@_argument_test_extract修饰函数的行的以下消息:

  
    

函数'_argument_test_extract'缺少位置参数

  

定义装饰器功能的行def _argument_test_extract(func):表示以下消息

  
    

通常函数的第一个参数是'self'

  

最后,行return func(**kwargs)表示以下消息:

  
    

'MyClass'不可调用

  

显然,如果我用_argument_test_extract装饰函数@staticmethod,PyCharm的所有警告都会消失,但由于此错误导致代码不再有效,TypeError: 'staticmethod' object is not callable

我的语法有问题吗?感谢

1 个答案:

答案 0 :(得分:1)

  

我的语法是否有问题

好吧......如果它有效,显然不是:-)。 pycharm的静态分析可能有问题。

表示, 对你正在做的事情感到奇怪。 PyCharm注意到(在创建类之后),_argument_test_abstract将成为类的方法。作为类的方法,_argument_test_abstract将需要一个参数。但是,在创建类时,_argument_test_abstract还不是一种方法,这就是装饰发生的时候 - 所以它有效。 (正如您所指出的,@staticmethod无法解决问题,因为staticmethod描述符本身不可调用,只有它从__get__返回的函数。)

那么,我们离开了哪里?您可以继续使用您拥有的内容并忽略pycharm,或者您可以将装饰器移出类并使其成为模块级别。它真的不需要首先在课堂上:-)。我认为将它从课堂中移出是更好的解决方案,因为很多人在阅读你的代码时会想到self在哪里以及每次尝试执行它时整个事情都不会爆炸,等