대부분의 답변에서 예를 들어
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
와 같다"
def f(foo=None, bar=None, **kwargs):
...etc...
이것은 사실이 아닙니다. 후자의 경우 f
로 호출 할 수 있지만 f(23, 42)
전자의 경우 에는 위치 호출이없는 명명 된 인수 만 허용 합니다. 발신자에게 최대의 유연성을 허용하려는 경우가 많으므로 대부분의 답변에서 주장하는 것처럼 두 번째 형식이 바람직합니다. 그러나 항상 그런 것은 아닙니다. 일반적으로 몇 개의 매개 변수 만 전달되는 많은 선택적 매개 변수를 허용하는 경우 명명 된 인수를 강제로 사용하는 것이 좋습니다 (예 : 호출 사이트에서 사고 및 읽을 수없는 코드 방지) threading.Thread
. 첫 번째 형태는 파이썬 2에서 구현하는 방법입니다.
이 관용구는 파이썬 3에서 특별한 지원 구문을 갖 *
습니다. def
서명 에서 단일 뒤에 오는 모든 인수 는 키워드 전용입니다. 즉, 위치 인수로 전달 될 수없고 이름이 지정된 인수로만 전달 될 수 있습니다. 따라서 Python 3에서는 위와 같이 코드를 작성할 수 있습니다.
def f(*, foo=None, bar=None, **kwargs):
...etc...
실제로 Python 3 에서는 선택 사항 이 아닌 키워드 전용 인수 (기본값 이없는 인수)를 가질 수도 있습니다 .
그러나 Python 2는 여전히 생산적인 수명이 길기 때문에 Python 3에서 언어로 직접 지원되는 중요한 디자인 아이디어를 Python 2에서 구현할 수있는 기술과 관용구를 잊지 않는 것이 좋습니다 !