如果我想使用装饰器,如下所示:
@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
答案 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
语句是可执行语句。您对功能文本的静态外观感到困惑。在调用外部函数之前,没有内部函数对象供您访问。这必然是这样,因为内部函数对象关闭外部函数的调用的变量(上下文)。或者更简单地说,在以下代码中,两个函数returned1
和returned2
是不同的函数:
def outer(x):
def inner(y):
return x+y
return inner
returned1 = outer(2)
returned2 = outer(2)