2016-07-02 3 views
0

함수의 사용 가능한 세부 정보를 표시하는 인트로 피 션 스 D자를 작성하려고합니다. 다음 코드의 바닥과 같은
뭔가 :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을 변화 달성에 실패 해요 d 갖고 싶습니다

__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)))