Python에서 인수를 언제 None으로 설정해야합니까?
제 질문의 초점은 디자인입니다.
가능한 인수가 있고 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)? 아니면 더 나은 디자인이 있습니까?
그리고 유형 검증이 필요하다면 이것에 가장 적합한 기능은 무엇입니까?
답변
기본 인수에 대해 현명한 결정을 내리려면 이러한 함수가 어떻게 사용되는지 컨텍스트를 알아야합니다! .
foo가 모듈 또는 구성 요소의 공용 API의 일부가 될 경우 기본 인수를 제공하면 매개 변수없이이 형식으로 호출 a=None되는 빈번한 사용 시나리오가 있다고 가정합니다 foo(). 같은 측정을 위해 보유 bar및 baz:
이러한 기능은 "내부적으로"사용됩니까? 그런 다음 기본 인수를 제공하면 반복 코드가 절약되는지
bar(a, b)또는 한 번 또는 두 번만 호출 되는지 또는 내에서만 호출 되는지 여부를 정확하게 알 수 있습니다foo.이 경우 기본 인수는 유용하지 않습니다.아니면 그 함수도 공용 API의 일부입니까? 그런 다음 일반적인 사용 시나리오가 어떻게 생겼는지 추정해야합니다 (실제 컨텍스트가 필요함).
bar와 같이 호출 할 수있는 기능을bar(b="some value")제공하려면bar(a=none, b)의 기본 매개 변수에 관계없이 서명을 제공해야합니다foo.
따라서 기본 인수에 대한 결정을 내리려면 구현 측면을 보지 말고 사용 측면을 살펴보십시오!
유형 검증 관련 : 저는 파이썬에서이 주제에 대한 전문가는 아니지만 정적 유형 분석을 위해 유형 주석을 추가하려면 IMHO를 호출 체인의 모든 수준에서 추가하는 것이 가장 합리적 이라고 생각합니다. 유형 분석을 작동시키는 데 실제로 필수). "가장 안쪽에있는 함수"( baz)가 특정 유형의 인수 만 예상하는 경우 분명히 유형 주석을 거기에 넣어야합니다. 이것은, 그러나, 그 의미 foo와 bar너무나 수단은 정적 유형 분석을위한 주석이 필요 동일한 유형의 인수, 제대로 작동합니다.