你如何在一个你无法访问其定义的函数上使用python decorator?

时间:2011-08-16 04:52:29

标签: python decorator

假设出于管理原因,我没有对模块xxx的写访问权。

我想做类似的事情:

from xxx import yyy

@myDeco
yyy

当然失败了。

我想我能做到

yyy = myDeco(yyy)

但是有没有办法使用@myDeco“符号?或者这只是在def之前才允许?

2 个答案:

答案 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)

使用了。因此,如果您拥有的是某个变量中的函数对象,则不能使用装饰器语法糖并且必须恢复到第二种方法。