定义后装饰一个函数?

Ale*_*air 6 python python-decorators

认为答案是肯定的,但我似乎无法找到明确的主张.我有以下情况;

def decorated_function(function):
    @functools.wraps(function)
    def my_function():
        print "Hello %s" % function.__name__
    return my_function

for attr, value in dct.iteritems():
    dct[attr] = decorated_function(value)
Run Code Online (Sandbox Code Playgroud)

而我真正想要的是这样的;

def my_function(function):
    print "Hello %s" % function.__name__

for attr, value in dct.iteritems():
    dct[attr] = functools.wraps(my_function, value)
Run Code Online (Sandbox Code Playgroud)

删除decor_function令人困惑的shell.装饰器只能在定义函数时应用吗?

Til*_*ann 15

您可以在定义函数后对其进行修饰.实际上,函数装饰器只是语法糖.例如,您可以替换

@classmethod
@synchronized(lock)
def foo(cls):
    pass
Run Code Online (Sandbox Code Playgroud)

def foo(cls):
    pass
foo = synchronized(lock)(foo)
foo = classmethod(foo)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://www.python.org/dev/peps/pep-0318/.

  • 是的,如果您将 `foo` 声明为全局,它也会在所有其他名称范围中修改 `foo`。但是,您对“sync_foo”的最后建议可能是最好的主意:它使全局“foo”保持不变,并且清楚地区分您的本地修改版本以避免混淆。 (2认同)