Mic*_*ael 4 python decorator pycharm 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
Run Code Online (Sandbox Code Playgroud)
PyCharm 为我用以下修饰函数的行指示以下消息@_argument_test_extract:
函数“_argument_test_extract”缺少位置参数
定义装饰器函数的行def _argument_test_extract(func):指示以下消息
通常函数的第一个参数是“self”
最后该行return func(**kwargs)显示以下消息:
“MyClass”不可调用
_argument_test_extract显然,如果我用 PyCharm 的所有警告消失来装饰函数@staticmethod,但代码由于此错误而不再工作,TypeError: 'staticmethod' object is not callable.
我的语法有问题吗?谢谢
我的语法有问题吗
好吧...如果它有效,显然不行:-)。可能是pycharm的静态分析有问题。
话虽如此,你所做的事情有些奇怪。PyCharm 注意到(在创建类之后),_argument_test_abstract将成为该类的一种方法。作为类的方法,_argument_test_abstract需要一个参数。然而,在类创建期间,_argument_test_abstract还不是方法,这是装饰发生的时候——所以它有效。(正如您所指出的,@staticmethod并不能解决问题,因为staticmethod描述符本身不可调用,只能调用它返回的函数__get__)。
那么,这给我们留下了什么呢?您可以继续使用现有的内容并忽略 pycharm,或者您可以将装饰器移出类并使其成为模块级别。它确实不需要首先出现在课堂上:-)。我认为将它移出类是更好的解决方案,因为很多阅读你的代码的人会想知道它在哪里self以及每次你尝试执行它时整个事情如何不会爆炸,等等。