2017-02-20 6 views
2

에서 위치 인수의 이름을 얻을, 나는 몇 가지 기능, 즉 모든 위치 인수의 이름을 얻으려고 : 지금파이썬 3.x를 사용하여 함수의 서명

def foo(a, b, c=1): 
    return 

을 나는이 일을 해요 :

from inspect import signature, _empty 
args =[x for x, p in signature(foo).parameters.items() if p.default == _empty] 

기능이 * 인수를 alows 즉 :

def foo(a, b, c=1, *args): 
    return 

내가 줄을 추가 해요 :

args.remove("args") 

더 좋은 방법이 있는지 궁금합니다.


* 인수의 경우 처리하는 하나의 좋은 방법 suggested by Jim Fasarakis-Hilliard으로하는 Parameter.kind을 사용하고 있습니다 :

from inspect import signature, Parameter 
args =[] 
for x, p in signature(foo).parameters.items(): 
    if p.default == Parameter.empty and p.kind != Parameter.VAR_POSITIONAL: 
     args.append(x) 
+0

'args'는 어떤 종류의 "* agreement *"일 뿐이므로 원하는 매개 변수를 호출 할 수 있습니다. 따라서이 매개 변수가 작동하지 않는 경우가있을 수 있습니다. –

+0

사실, 그 질문을하는 이유 중 하나입니다. 지금은 내 자신의 기능을 위해 이것을 사용하고 args 규약을 따르지만 좀 더 "견고한"방법으로 동일한 것을 달성하는 방법을 궁금해합니다. –

답변

4

예, 추가로 확인하여보다 강력한 솔루션을 달성 할 수있는 경우 매개 변수의 .kind 속성 이 (가) Parameter.VAR_POSITIONAL과 같지 않습니다.

>>> def foo(a, b, c=1, *args): pass 
>>> print(signature(foo).parameters['args'].kind) 
VAR_POSITIONAL 

그러니 그냥 inspect에서 Parameter를 가져오고 추가하거나 조건 kind != Parameter.VAR_POSITIONAL 그 :

>>> from inspect import Parameter 
>>> Parameter.VAR_POSITIONAL == p['args'].kind 
True 
*args를 들어

, 이것은 당신이 함수의 서명 오브젝트를 빌드 할 때 설정 값입니다

+0

'._kind' 대신'.kind'를 사용하는 것이 낫지 않습니까? 밑줄로 시작하는 속성은 * private *로 간주됩니다. –

+0

예 @WillemVanOnsem, 빠른 타이핑은 때로는 나보다 잘됩니다. –

+0

감사합니다. * args의 문제를 해결합니다. 나는 아직도 목록 이해가 약간 못 생겼다. –