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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类中的装饰器在Pycharm中抛出警告相关的知识,希望对你有一定的参考价值。

我正在使用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代码不再工作了。

我的语法有问题吗?谢谢

答案

我的语法有问题吗?

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

话虽如此,你正在做的事情有些奇怪。 PyCharm注意到(在课堂创建之后),_argument_test_abstract将成为班级的一种方法。作为一个类的方法,_argument_test_abstract将需要一个参数。然而,在课堂创作过程中,_argument_test_abstract还不是一种方法,这就是装饰发生的时候 - 所以它有效。 (正如你所说,@staticmethod没有解决问题,因为staticmethod描述符本身不可调用,只有它从__get__返回的函数)。

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

以上是关于类中的装饰器在Pycharm中抛出警告的主要内容,如果未能解决你的问题,请参考以下文章

super() 在 Sublime Text 中抛出错误,在 PyCharm/Terminal 中有效

在类中抛出异常的最佳方法是什么?

为啥 requests-mock 装饰器模式会在 pytest 中抛出“fixture 'm' not found”错误?

python 一个简单的装饰函数,你想在主线程之外的背景中抛出。

C#如何在中间层类中抛出异常时获得控制焦点

为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)