【发布时间】:2015-06-11 20:34:36
【问题描述】:
鉴于以下设置:
def mapper(f):
def wrapper(items):
for x in items:
yield f(x)
wrapper.__name__ = f.__name__ # This has no effect!
return wrapper
@mapper
def double(x):
return x * 2
装饰器按预期工作:
>>> [x for x in double([1,2,3])]
[2, 4, 6]
但是,它的 __name__ 不是 double 所需的:
>>> double([1,2]).__name__
"wrapper"
是否可以强制生成器的名称?
或者,是否可以在生成器对象中挖掘并检索名称double?
【问题讨论】:
-
我认为你需要
functools.wraps。看到这个:stackoverflow.com/questions/308999/what-does-functools-wraps-do/… -
@Pynchia: 做同样的事情(加上其他属性副本)。
-
我认为这里真正的问题是“你怎么能重新
__name__一个生成器对象?”;您想在装饰器中这样做是偶然的。 -
谢谢@jonrsharpe,我已经修改了标题。
-
嗨@Scott,更改生成器的名称只是达到目的的一种手段:在通过转换时保留函数名称一个装饰师。 (我的示例旨在按照这些思路提出一个合理的用例。)
标签: python python-2.7 generator