2013-11-09 43 views
0

获取函数中定义的函数如果我想如下使用装饰:通过装饰

@getFunc('bar') 
def foo(): 
    def bar(): 
     print '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 
+0

我想一个办法是使用'inspect'和'ast'模块。 –

+0

简短的回答:你不能 – alko

+1

[在Python中如何获取/设置函数(从外部)的局部变量?](http://stackoverflow.com/questions/1360721/how-to-get-get-设置局部变量的函数从外部在python) – alko

回答

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 
0

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

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

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

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

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

returned1 = outer(2) 
returned2 = outer(2) 
+0

它是一个装饰器的事实实际上在这种情况下是无关紧要的。我想适当的问题是:给定一个函数对象,我可以通过名称检索该对象中定义的函数吗?我想我可以得到该函数的文本的AST,但这似乎是矫枉过正。 – grivescorbett

+0

@grivescorbett如果你想完全忽略所有的风格和设计原则,这只是无关紧要的。无论如何,你的问题的答案是,你不能。详情请参阅我编辑的答案。 – Marcin