Python에서 인수를 언제 None으로 설정해야합니까?

Sep 10 2020

제 질문의 초점은 디자인입니다.

가능한 인수가 있고 None최종적으로 사용될 때까지 여러 함수간에 전달되는 경우 어떤 함수가이를 기본 인수로 처리해야합니까?

예를 들어, 다음 코드 블록을 가정하십시오.

def foo(a):
 b = # some code block to assign b
 return bar(a, b)

def bar(a, b):
 c = # some code block to assign c
 return baz(a, b, c)

def baz(a, b, c):
 return a + b + c

기본값은에서만 설정해야하며 foo다른 모든 함수는 인수를 필수로 예상해야합니다 (예 :) foo(a=None); bar(a, b); baz(a, b, c)? 아니면 더 나은 디자인이 있습니까?

그리고 유형 검증이 필요하다면 이것에 가장 적합한 기능은 무엇입니까?

답변

4 DocBrown Sep 10 2020 at 09:55

기본 인수에 대해 현명한 결정을 내리려면 이러한 함수가 어떻게 사용되는지 컨텍스트를 알아야합니다! .

foo가 모듈 또는 구성 요소의 공용 API의 일부가 될 경우 기본 인수를 제공하면 매개 변수없이이 형식으로 호출 a=None되는 빈번한 사용 시나리오가 있다고 가정합니다 foo(). 같은 측정을 위해 보유 barbaz:

  • 이러한 기능은 "내부적으로"사용됩니까? 그런 다음 기본 인수를 제공하면 반복 코드가 절약되는지 bar(a, b)또는 한 번 또는 두 번만 호출 되는지 또는 내에서만 호출 되는지 여부를 정확하게 알 수 있습니다 foo.이 경우 기본 인수는 유용하지 않습니다.

  • 아니면 그 함수도 공용 API의 일부입니까? 그런 다음 일반적인 사용 시나리오가 어떻게 생겼는지 추정해야합니다 (실제 컨텍스트가 필요함). bar와 같이 호출 할 수있는 기능을 bar(b="some value")제공하려면 bar(a=none, b)의 기본 매개 변수에 관계없이 서명을 제공해야합니다 foo.

따라서 기본 인수에 대한 결정을 내리려면 구현 측면을 보지 말고 사용 측면을 살펴보십시오!

유형 검증 관련 : 저는 파이썬에서이 주제에 대한 전문가는 아니지만 정적 유형 분석을 위해 유형 주석을 추가하려면 IMHO를 호출 체인의 모든 수준에서 추가하는 것이 가장 합리적 이라고 생각합니다. 유형 분석을 작동시키는 데 실제로 필수). "가장 안쪽에있는 함수"( baz)가 특정 유형의 인수 만 예상하는 경우 분명히 유형 주석을 거기에 넣어야합니다. 이것은, 그러나, 그 의미 foobar너무나 수단은 정적 유형 분석을위한 주석이 필요 동일한 유형의 인수, 제대로 작동합니다.