Python:识别创建生成器的生成器函数

Python:识别创建生成器的生成器函数,python,generator,yield,python-3.3,Python,Generator,Yield,Python 3.3,给定生成器对象,是否可以识别用于创建它的函数 def gen_func(): yield gen = gen_func() // From `gen`, how do I get a reference to `gen_func` ? 我正在实现一个decorator,该decorator用于用附加属性修饰生成器函数。稍后我需要从生成器本身访问该属性。您真正要求的是不可能以干净的方式实现的,这既因为生成器对象无权访问其生成器函数,也因为无法在生成器上创建新属性 但是你想要达到的目标

给定生成器对象,是否可以识别用于创建它的函数

def gen_func():
    yield

gen = gen_func()

// From `gen`, how do I get a reference to `gen_func` ?

我正在实现一个decorator,该decorator用于用附加属性修饰生成器函数。稍后我需要从生成器本身访问该属性。

您真正要求的是不可能以干净的方式实现的,这既因为生成器对象无权访问其生成器函数,也因为无法在生成器上创建新属性

但是你想要达到的目标可能是可能的。下面是一个示例装饰器,它将生成器包装在迭代器对象中,并向迭代器对象添加自定义属性:

def add_stuff(f):
    def replacement(*args, **kwargs):
        gen = f(*args, **kwargs)
        class FakeGenerator(object):
            def __iter__(self):
                return self
            def next(self):
                return gen.next()
        fakegen = FakeGenerator()
        fakegen.foo = "whatever"
        fakegen.generator_function = f
        return fakegen
    return replacement

@add_stuff
def gen_func():
    yield

gen = gen_func()
print gen
print gen.foo

没有黑魔法,不。你仍然可以得到函数名
gen.gi\u code.co\u name
gen.gi\u frame.f\u globals[gen.gi\u code.co\u name]
,也许吧?有时?如果你幸运的话?