如何获取已创建迭代器的函数生成器的引用?

时间:2012-03-24 15:47:57

标签: python

我想获得一个引用回到创建迭代器的函数。在我的情况下,我有兴趣获得原始文档字符串。

示例:

def my_generator():
    """this is my generator"""
    for x in (1,2,3):
        yield x


my_iter = my_generator()

# in another part of my code where I Only have access to the iterator
# no access to the generator function "my_generator"
assert my_iter.????.__doc__ == "this is my generator"

2 个答案:

答案 0 :(得分:2)

感觉很讨厌,但是文档字符串的一种方法是通过co_consts

localhost-2:coding $ cat mod1.py
def my_generator():
    """this is my generator"""
    for x in (1,2,3):
        yield x

it = my_generator()

localhost-2:coding $ python
Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod1
>>> mod1.it.__doc__
>>> mod1.it.gi_code.co_consts[0]
'this is my generator'
>>> z = mod1.my_generator()
>>> z.__doc__
>>> z.gi_code.co_consts[0]
'this is my generator'

我更倾向于找出一些装饰器应用于生成器函数以确保文档字符串保留。

如果你需要这个功能,那么:

>>> import mod1
>>> z = mod1.my_generator()
>>> z.__doc__
>>> z.gi_frame.f_globals[z.__name__]
<function my_generator at 0x1004b7cf8>
>>> z.gi_frame.f_globals[z.__name__] is mod1.my_generator
True
>>> z.gi_frame.f_globals[z.__name__].__doc__
'this is my generator'

但我不承诺这适用于所有情况..

答案 1 :(得分:1)

locals()[my_iter.__name__].__doc__怎么样?