많은 답변에 전체 정보의 작은 조각이 있으므로 내가 가장 좋아하는 패턴과 함께 모두 가져오고 싶습니다.
기본값은 mutable
유형입니다.
기본값이 변경 가능한 객체 인 경우 운이 좋습니다. 함수가 정의 될 때 Python의 기본 인수가 한 번 평가된다는 사실을 이용할 수 있습니다 (마지막 섹션의 답변 끝에서 이에 대해 더 자세히 설명합니다).
즉 is
, 함수 또는 메서드로 다음 예제에서와 같이 기본 변경 가능 값을를 사용하여 쉽게 비교 하여 인수로 전달되었는지 또는 기본적으로 남아 있는지 확인할 수 있습니다.
def f(value={}):
if value is f.__defaults__[0]:
print('default')
else:
print('passed in the call')
과
class A:
def f(self, value={}):
if value is self.f.__defaults__[0]:
print('default')
else:
print('passed in the call')
변경 불가능한 기본 인수
이제 기본값이 immutable
값 이 될 것으로 예상되는 경우 (문자열도 불변임을 기억하십시오!) 트릭을있는 그대로 악용 할 수 없지만 여전히 변경할 수있는 작업이 있기 때문에 다소 덜 우아합니다 . 유형; 기본적으로 함수 시그니처에 가변 "가짜"기본값을, 함수 본문에 원하는 "실제"기본값 을 넣습니다 .
def f(value={}):
"""
my function
:param value: value for my function; default is 1
"""
if value is f.__defaults__[0]:
print('default')
value = 1
else:
print('passed in the call')
print(value)
실제 기본값이 None
이지만 None
변경 불가능한 경우 특히 재미있게 느껴지 므로 여전히 변경 가능을 함수 기본 매개 변수로 명시 적으로 사용하고 코드에서 없음으로 전환해야합니다.
Default
변경 불가능한 기본값에 클래스 사용
또는 @cz 제안과 유사하게, 파이썬 문서가 충분하지 않다면 :-), API를 더 명시 적으로 만들기 위해 (문서를 읽지 않고) 사이에 객체를 추가 할 수 있습니다. used_proxy_ Default 클래스 인스턴스는 변경 가능하며 사용하려는 실제 기본값을 포함합니다.
class Default:
def __repr__(self):
return "Default Value: {} ({})".format(self.value, type(self.value))
def __init__(self, value):
self.value = value
def f(default=Default(1)):
if default is f.__defaults__[0]:
print('default')
print(default)
default = default.value
else:
print('passed in the call')
print("argument is: {}".format(default))
지금:
>>> f()
default
Default Value: 1 (<class 'int'>)
argument is: 1
>>> f(2)
passed in the call
argument is: 2
위의 내용은 Default(None)
.
기타 패턴
분명히 위의 패턴은 print
작동 방식을 보여주기 위해 존재하는 모든 것 때문에 예상보다 추악 해 보입니다 . 그렇지 않으면 나는 그것들을 간결하고 충분히 반복 할 수 있다고 생각합니다.
당신은 추가 할 수있는 장식 쓸 수있는 __call__
당신이 밖으로 분할해야 - 더 능률적 인 방법으로 @dmg에 의해 제안 패턴을, 그러나 이것은 여전히 함수 정의 자체가 이상한 트릭을 사용하도록 강요합니다 value
및 value_default
그래서, 당신의 코드를 필요 구별하는 경우 그 나는 많은 이점을 보지 못하고 예제를 쓰지 않을 것입니다 :-)
Python에서 기본값으로 변경 가능한 유형
# 1 python gotcha 에 대해 조금 더 ! , 위의 자신의 즐거움을 위해 학대 받았습니다. 다음을 수행하여 정의 에서 평가 로 인해 어떤 일이 발생하는지 확인할 수 있습니다 .
def testme(default=[]):
print(id(default))
원하는 testme()
만큼 실행할 수 있으며 항상 동일한 기본 인스턴스에 대한 참조를 볼 수 있습니다 (기본적으로 기본값은 변경 불가능합니다 :-)).
파이썬에 있다는 것을 기억 불과 3 변경 가능한 내장 유형 : set
, list
, dict
, 다른 모든 것-심지어 문자열! -불변입니다.