2

ジェネレータ オブジェクトが与えられた場合、それを作成するために使用された関数を特定することは可能ですか?

def gen_func():
    yield

gen = gen_func()

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

ジェネレーター関数を追加の属性で装飾するために使用されるデコレーターを実装しています。後でジェネレーター自体からその属性にアクセスする必要があります。

4

1 に答える 1

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
于 2013-03-29T03:14:10.177 に答える