0

如果我想使用如下装饰器:

@getFunc('bar')
def foo():
    def bar():
        print 'bar'

如何让装饰器检索名为 bar 的内部函数?

def getFunc(str)
    def getFunc_inner(func):
        def new(*args, **kwargs):
            func(*args, **kwargs)
            myFunc = ??# Get function named {str} from func
        return new
    return getFunc_inner
4

2 回答 2

0

你可以像这样返回函数:

from functools import wraps
def method_decorator(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        res =  fn(*args,**kwargs)
        if callable(res):
            return res()
        return res
    return wrapper

@method_decorator
def foo( *args, **kwargs):
    def baz():
        return "foo"
    return baz

@method_decorator
def bar( *args, **kwargs):
    return("bar")

if __name__ == "__main__":
    print(foo())
    print(bar())

印刷:

foo
bar
于 2013-11-09T23:32:01.840 回答
0

装饰器不能,也不会“检索”函数。装饰器是一个函数,它接受一个函数(被装饰的函数),并返回另一个函数(装饰过程的结果)。

如果被包装的函数要返回它的内部函数,那么装饰器创建的函数可以做任何它喜欢的事情。

给定一个函数对象,我可以按名称检索该对象中定义的函数吗?

不,因为def语句是可执行语句。您对函数文本的静态外观感到困惑。在调用外部函数之前,没有内部函数对象可供您访问。这是必然的,因为内部函数对象关闭了外部函数调用的变量(上下文)。或者更简单地说,在下面的代码中,两个函数returned1returned2是不同的函数:

def outer(x):
    def inner(y):
        return x+y
    return inner

returned1 = outer(2)
returned2 = outer(2)
于 2013-11-09T23:48:54.743 回答