【问题标题】:Python: Identify the generator function that created a generatorPython:识别创建生成器的生成器函数
【发布时间】:2013-02-12 00:13:42
【问题描述】:

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

def gen_func():
    yield

gen = gen_func()

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

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

【问题讨论】:

  • 没有黑魔法,没有。还是可以得到函数名gen.gi_code.co_name
  • gen.gi_frame.f_globals[gen.gi_code.co_name],也许吧?有时?如果你幸运的话?

标签: python generator yield python-3.3


【解决方案1】:

您真正要求的内容不可能以一种干净的方式实现,既因为生成器对象无法访问其生成器函数,又因为无法在生成器上创建新属性。

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

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

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2018-12-18
    • 2014-07-24
    • 2016-12-16
    • 1970-01-01
    • 2013-10-02
    • 2020-09-16
    • 2012-10-25
    相关资源
    最近更新 更多