2013-02-12 3 views
2

Учитывая объект-генератор, можно ли определить функцию, используемую для его создания?Python: определить функцию генератора, которая создала генератор

def gen_func(): 
    yield 

gen = gen_func() 

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

Я реализую декоратор, используемый для украшения функции генератора дополнительным атрибутом. Мне нужно получить доступ к этому атрибуту позже из самого генератора.

+0

Без черной магии нет. Вы все равно можете получить имя функции «gen.gi_code.co_name' – JBernardo

+1

' gen.gi_frame.f_globals [gen.gi_code.co_name] ', может быть? Иногда? Если вам повезет? – DSM

ответ

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 
Смежные вопросы