2012-03-02 4 views
63

필자는 여러 가지 인수를 취하는 Python 함수를 사용합니다. 이러한 인수 중 일부는 일부 시나리오에서 생략 될 수 있습니다.선택적 인수를 사용하여 파이썬 함수를 만드는 방법은 무엇입니까?

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None): 
    #code 

인수 hd 통해 각각 다른 의미를 가질 문자열이다. 어떤 선택적 매개 변수를 어떤 조합으로 전달할지 선택할 수 있다는 것이 중요합니다. 예를 들어, (a, b, C, d, e) 또는 (a, b, C, g, h) 또는 (a, b, C, d, e, f 또는 모두 (내 선택 사항입니다).

함수를 오버로드 할 수 있다면 좋을 것입니다.하지만 파이썬은 오버로딩을 지원하지 않습니다. 필요한 int 인수 중 일부를 목록에 삽입하려고했는데 인수 불일치 오류가 발생했습니다.

지금 당장 나는 처음 몇 개의 누락 된 인수 대신 빈 문자열을 자리 표시 자로 보냅니다. 나는 실제 값을 사용하여 함수를 호출 할 수 있기를 원한다.

이렇게 할 방법이 있습니까? 인수 목록 대신 목록을 전달할 수 있습니까?

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p] 
+0

관련 후 평가 핵심 모든 매개 변수의 사전 것이다 : [** 무엇을 (더블 스타/별표)와 * (별표/별표) 매개 변수 수행을 ?] (https://stackoverflow.com/q/36901/3357935) –

답변

74

이 좋아 호출 시도 : obj.some_function('1', 2, '3', g="foo", h="bar")

은 지금하는 ctypes를 사용하여 프로토 타입과 같이 보입니다. 필요한 위치 인수 뒤에 특정 선택적 인수를 이름으로 지정할 수 있습니다.

94

그냥 * args 매개 변수를 사용하면 a,b,c 뒤에 원하는만큼의 인수를 전달할 수 있습니다. args-> c, d, e, f를 매핑하는 로직을 추가해야하지만 오버로드의 "방법"을 추가해야합니다.

def myfunc(a,b, *args, **kwargs): 
    for ar in args: 
     print ar 
myfunc(a,b,c,d,e,f) 

그리고


c,d,e,f는 마찬가지로 당신이 kwargs로 인수를 사용할 수 있습니다 다음, 당신이 당신의 매개 변수의 이름을 수 인쇄됩니다.

def myfunc(a,b, *args, **kwargs): 
     c = kwargs.get('c', None) 
     d = kwargs.get('d', None) 
     #etc 
myfunc(a,b, c='nick', d='dog', ...) 

그리고 kwargs로는 a,b

+0

고맙습니다. 코드에서 이처럼 많은 유연성을 사용할 수는 없지만 목록에있는 여러 빈 구멍을 사용하여 호출하는 문제를 해결하지는 못합니다. 다른 프로젝트에서 사용할 수있는 훌륭한 도구입니다. Russel Borogove가 내 문제에 필요한 정확한 대답을주었습니다. 나는 행복합니다. – Thalia

+5

[임의의 인수 목록] (http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists)이라고합니다. – FabienB

관련 문제