假设出于管理原因,我没有对模块xxx的写访问权。
我想做类似的事情:
from xxx import yyy
@myDeco
yyy
当然失败了。
我想我能做到
yyy = myDeco(yyy)
但是有没有办法使用@myDeco
“符号?或者这只是在def
之前才允许?
答案 0 :(得分:7)
仅@
或def
之前允许使用class
语法。
答案 1 :(得分:4)
在Python参考文档Compound Statements部分中,它说:
decorated ::= decorators (classdef | funcdef)
decorators ::= decorator+
decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
这是语法规则的一部分。如您所见,装饰器仅在函数或类定义之前应用,这是def <funcname>
启动的内容。它继续,注意到:
函数定义可以由一个或多个装饰器包装 表达式。函数的时候会计算装饰器表达式 在包含函数定义的范围内定义。
那就是说,请记住装饰器实际上只是语法糖,并且在它们可用之前就形成了:
func = decorate_func(func)
使用了。因此,如果您拥有的是某个变量中的函数对象,则不能使用装饰器语法糖并且必须恢复到第二种方法。