我正在使用 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
。
我的语法有问题吗?感谢
答案 0 :(得分:1)
好吧......如果它有效,显然不是:-)。 pycharm的静态分析可能有问题。我的语法是否有问题
表示, 对你正在做的事情感到奇怪。 PyCharm注意到(在创建类之后),_argument_test_abstract
将成为类的方法。作为类的方法,_argument_test_abstract
将需要一个参数。但是,在创建类时,_argument_test_abstract
还不是一种方法,这就是装饰发生的时候 - 所以它有效。 (正如您所指出的,@staticmethod
无法解决问题,因为staticmethod
描述符本身不可调用,只有它从__get__
返回的函数。)
那么,我们离开了哪里?您可以继续使用您拥有的内容并忽略pycharm,或者您可以将装饰器移出类并使其成为模块级别。它真的不需要首先在课堂上:-)。我认为将它从课堂中移出是更好的解决方案,因为很多人在阅读你的代码时会想到self
在哪里以及每次尝试执行它时整个事情都不会爆炸,等