2012-03-24 4 views
0

イテレータを作成した関数にリファレンスを戻したいと考えています。私の場合、元のdocstringを取得することに興味があります。イテレータを作成した関数ジェネレータへの参照を取得する方法は?

例:

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" 
+0

あなたは右 'dir'機能、知っていますか? – Marcin

答えて

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' 

docstringはそのままです。

あなたは関数自体が必要な場合は、方法について:

>>> 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' 

が、私は、これはすべてのケースのために働くという約束をしない。..

+0

これは、関数への参照を取得するより一般的な問題を解決しませんが、それは私の問題を解決するので、私はそれを受け入れています。このジェネレータ関数は "クライアントコード"上にあるため、私はデコレータを使用できません。 – schettino72

+0

残念ながら、gi_frame.f_globalsのソリューションは私のテストケースでは機能しません。実際に私がここに質問を投稿する前に、私は試してみました: 'z.gi_frame.f_back.f_locals [z .__ name __]'何らかの理由でz.gi_frame.f_backは常にNoneです。 – schettino72

1

locals()[my_iter.__name__].__doc__は?

+1

私は質問を更新しました。もちろんジェネレータ関数はローカル名前空間にはありません。 D – schettino72