선택적 인수를 사용하여 Python 함수를 작성하는 방법


219

몇 가지 인수를 취하는 Python 함수가 있습니다. 일부 시나리오에서는 이러한 인수 중 일부를 생략 할 수 있습니다.

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

인수를 d통해 h서로 다른 의미를 갖는다 문자열이다. 어떤 조합으로 전달할 선택적 매개 변수를 선택할 수 있어야합니다. 예를 들어, (a, b, C, d, e)또는 (a, b, C, g, h), 또는 (a, b, C, d, e, f, 또는 전부 (나의 선택).

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

현재 자리 표시 자로 누락 된 첫 번째 인수 대신 빈 문자열을 보내고 있습니다. 실제 값을 사용하여 함수를 호출하고 싶습니다.

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

현재 ctypes를 사용한 프로토 타입은 다음과 같습니다.

_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]

답변:


196

다음과 같이 호출하십시오 obj.some_function( '1', 2, '3', g="foo", h="bar" ). 필수 위치 인수 뒤에 특정 선택적 인수를 이름으로 지정할 수 있습니다.


246

그냥 사용 *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


감사합니다. 내 코드 에서이 유연성을 사용할 수는 없지만 내 목록의 다양한 빈 구멍으로 호출하는 문제를 해결하지 못하지만 다른 프로젝트에서 사용하기에 좋은 도구입니다. Russel Borogove는 제 문제에 필요한 정확한 답을주었습니다. 저는 행복합니다.
Thalia

12
그것은라고 임의의 인수 목록
FabienB

@Nix, 나는 당신의 대답을 정말로 좋아합니다. 그러나이 명세서 c = kwargs.get('c', None)가 어떤 용도로 사용 되는지 명확하게 설명해 주 시겠습니까? 선택적 인수가있는 모든 함수에 필요합니까? 귀하의 코드에는 2 개의 선택적 인수 만 있습니다. 사용자가 다른 인수를 원한다면 어떻게해야 e합니까? 알 수없는 선택적 인수에 대해 샘플 코드를 어떻게 변경 def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)합니까? c = kwargs.get('c', None) etc하기 전에 포함시켜야 obj.add(c, d, ...)합니까?
니모

시간 복잡성이 걱정된다면. 이것은 문제 일 것입니다
NduJay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.