在修饰函数时,可以使用方法@object.method,也可以使用属性属性的方法,如@object.attribute.attribute.method。您还可以向装饰器@function(foo="bar")传递额外的参数。
然而,这些冲突似乎。当链中有一个函数调用时,python似乎假设它是将参数传递给装饰器的位,之后的任何链都是SyntaxError。
这里有我遗漏的东西吗?这种行为的原因还是绕过它的方法?
这段代码是为Python3.4编写的。
#!/usr/bin/env python3
class Decorator:
def decorate(self, callback):
return callback
_dec = Decorator()
def findit():
return _dec
class B: dec = _dec
class A: bar = B()
foo = A()
dec = findit()
@dec.decorate
#@findit().decorate
#Above line is a syntax error
@foo.bar.dec.decorate #also permitted
def function():
pass错误:
File "test.py", line 17
@findit().decorate
^
SyntaxError: invalid syntax发布于 2017-05-23 18:48:40
用于装饰者的语法类似于:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
decorated: decorators (classdef | funcdef | async_funcdef)在这里,dotted_name是(AKA foo,foo.bar.spam等):
dotted_name: NAME ('.' NAME)*从语法上可以清楚地看到,括号后面只有一个换行符,而不是另一个dotted_name,因此它会抛出一个语法错误。
因此,要解决这个问题,请确保函数调用始终在末尾,如果函数调用在中间,则必须事先将其赋值给一个变量(仅从代码中提取):
dec = findit()
@dec.decorate对于与修饰器语法相关的历史记录,您可以查看下面的doc:https://wiki.python.org/moin/PythonDecorators
发布于 2017-05-23 18:46:50
你已经在你的问题中找到了解决办法。在应用findit()作为装饰师之前,只需对其进行评估:
dec = findit()
@dec.decorate
def function():
pass请记住,@decorator语法只是语法糖,所以上面的内容相当于:
def function():
pass
function = findit().decorate(function)https://stackoverflow.com/questions/44142441
复制相似问题