2016-07-02 4 views
0

私は関数の利用可能な詳細を表示するイントロスペクション・スタンザを作成したいとします。次のコードの下のような
何か:Pythonの属性名を印刷するには?

def sample(_range=4): 
    """ produce a range of integers """ 
    for i in range(_range): 
     yield i 

f = sample 
for i in (f.__name__, f.__doc__, f.__dict__, f.__code__, f.__defaults__, f.__globals__, f.__closure__): 
    print("XXX", i) 

私が代わりに

XXX sample 
XXX produce a range of integers 
XXX {} 
XXX <code object sample at 0xfff15890, file "/tmp/tmp.py", line 1> 
XXX (4,) 
XXX {'__loader__': <_frozen_importlib.SourceFileLoader object at 0xfff13b30>, '__package__': None, '__file__': '/tmp/tmp.py', '__cached__': None, 'i': {...}, 'f': <function sample at 0xfff5b1e0>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__spec__': None, '__name__': '__main__', 'sample': <function sample at 0xfff5b1e0>} 
XXX None 

私は」は、例えば属性名を印刷何か、にXXXを変更している達成するために失敗していますあなたが持っているように

__name__ sample 
__doc__ produce a range of integers 
__dict__ {} 
__code__ <code object sample at 0xfff15890, file "/tmp/tmp.py", line 1> 
__defaults__ (4,) 
f.__globals__ {'__loader__': <_frozen_importlib.SourceFileLoader object at 0xfff13b30>, '__package__': None, '__file__': '/tmp/tmp.py', '__cached__': None, 'i': {...}, 'f': <function sample at 0xfff5b1e0>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__spec__': None, '__name__': '__main__', 'sample': <function sample at 0xfff5b1e0>} 
__closure__ None 

XXXの代わりに何をお勧めしますか?

+0

あなたは辞書を使うだろうか?属性としてのキーと値としての名前 –

+2

代わりに名前を反復処理してみませんか? '[__name__ '、' __doc__ '、...]の名前は' ... 'です。 – jonrsharpe

+0

@MosesKoledoyeはフードの下で、まさに 'sample'オブジェクトです! – jonrsharpe

答えて

2

あなたの例のように、あなたが欲しい属性の名前を知っている場合、これは動作します:

for fn in ('__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__'): 
    print(fn, getattr(f, fn)) 

はあなたが持っているすべての機能であるときに、名前を取得する方法を求めている場合私はあなたが運がないと信じています。その名前は、関数のプロパティではなく、参照される方法です。数字3を含む変数の名前が数字からちょうど何かであるかを尋ねることができないのと同じくらいです。 (思考練習:それぞれ異なる名前の3つの異なるオブジェクトの一部である関数の名前は何ですか?)

特定のオブジェクトに関数の名前が必要だったとすると、そのオブジェクトの属性について、あなたの関数を検索します。あなたがそれを見つけたら、それを参照するのに使った名前があなたが望む名前になります。

+0

'getattr(f、fn)' – jonrsharpe

+0

'def foo():pass'は実際に関数オブジェクトに' foo'という名前を与えます。したがって、関数は名前を持つことができます。それはあなたが得ることができない変数です。 – poke

1

あなたはすでにあなたがgetattrを使用することができ、属性のリストを持っているので:

for name in ['__name__', '__doc__', '__dict__', '__code__', '__defaults__', '__globals__', '__closure__']: 
    print('{} -> {}'.format(name, getattr(f, name))) 
関連する問題