1

为什么这不起作用?我怎样才能让它工作?也就是说,我怎样才能让 gu 在我的装饰函数中访问?

def decorate(f):
    def new_f():
        def gu():
            pass
        f()
    return new_f

@decorate
def fu():
    gu()

fu()

我是否需要以某种方式将 gu 添加到已定义函数的字典中?或者我可以在调用它之前将 gu 添加到 f 的本地命名空间吗?

4

5 回答 5

3

如果您需要传递gufu您需要通过参数显式执行此操作:

def decorate(f):
    def new_f():
        def gu():
            pass
        f(gu)
    return new_f

@decorate
def fu(gu):
    gu()

fu()
于 2009-07-17T07:56:28.813 回答
1

gunew_f函数的本地函数,它是decorate函数的本地函数。

于 2009-07-17T07:53:25.233 回答
1

gu() 仅在 new_f() 中定义。除非您将其返回或将其锚定到 new_f() 或其他东西,否则不能从 new_f() 外部引用它

我不知道你在做什么,但这个方案似乎很复杂。也许您可以找到一个不太复杂的解决方案。

于 2009-07-17T07:54:30.473 回答
0

原则上,您可以使用与旧代码相同的代码创建一个新函数,但用修改后的代码替换全局范围:

import new

def with_bar(func):
    def bar(x):
        return x + 1
    f_globals = func.func_globals.copy()
    f_globals['bar'] = bar
    return new.function(func.func_code, f_globals,
                        func.func_name, func.func_defaults, func.func_closure)

@with_bar
def foo(x):
    return bar(x)

print foo(5) # prints 6

在实践中,您确实应该找到一种更好的方法来做到这一点。将函数作为参数传递是一种选择。也可能有其他方法,但是如果没有高级问题描述,很难说出适合的方法。

于 2009-07-17T08:56:36.463 回答
0

为什么不让你的装饰器成为一个类而不是一个函数呢?正如我在查看property内置帮助时发现的那样,这显然是可能的。(以前,我认为你可以只将装饰器应用于类,而不是装饰器本身可以是类。)

(当然,gu必须是类或内部类的方法。)

于 2009-07-17T15:38:50.907 回答