类中的装饰器在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 一个简单的装饰函数,你想在主线程之外的背景中抛出。
为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)