通过装饰器获取函数中定义的函数

时间:2013-11-09 20:55:04

标签: python python-decorators

如果我想使用装饰器,如下所示:

@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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

  

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

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

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

returned1 = outer(2)
returned2 = outer(2)