- [BW 24] None과 독스트링을 사용해 동적인 디폴트 인자를 지정하라2024년 10월 23일
- 31514
- 작성자
- 2024.10.23.:01
종종 키워드 인자의 값으로 동적인 값을 넘겨주고 싶을 때가 있다.
예를 들어 로그 메시지와 시간을 함께 출력하고 싶다고 하자. 하지만 datetime.now()는 함수가 정의되는 시점에 단 한 번만 호출되기 때문에 타임스탬프가 항상 같다.
from time import sleep from datetime import datetime def log(message, when=datetime.now()): print(f'{when}: {message}') log('안녕!') sleep(1) log('다시 안녕!') >>> 2024-10-23 12:48:30.559487: 안녕! 2024-10-23 12:48:30.559487: 다시 안녕!
이런 경우 파이썬의 일반적인 관례는 디폴트 값을 None을 지정하고, 실제 동작을 Docstring에 문서화하는 것이다.
from time import sleep from datetime import datetime def log(message, when=None): """메시지와 타임스탬프를 로그에 남긴다. Args: message: 출력할 메시지 when: 메시지가 발생한 시각 """ if when is None: when = datetime.now() print(f'{when}: {message}') >>> log('안녕!') sleep(1) log('다시 안녕!')
디폴트 인자 값으로 None을 사용하는 것은 인자가 가변적인 경우 특히 중요하다.
다음은 디폴트 값이 단 한 번만 평가되어 default에 지정된 딕셔너리가 모든 decode 호출에 공유되어 발생하는 문제다.
import json def decode(data, default={}): try: return json.loads(data) except ValueError: return default foo = decode('잘못') foo['stuff'] = 5 bar = decode('잘못2') bar['meep'] = 1 print('Foo:', foo) print('Bar:', bar) >>> Foo: {'stuff': 5, 'meep': 1} Bar: {'stuff': 5, 'meep': 1}
키와 값이 하나뿐인 서로 다른 딕셔너리가 출력되지 않는다.
이러한 경우에도 키워드 인자의 디폴트 값으로 None을 지정하고, 함수의 Docstring에 동작 방식을 기술하여 해결할 수 있다.
import json def decode(data, default=None): """문자열로부터 JSON 데이터를 읽어온다 Args: data: 디코딩할 JSON 데이터 default: 디코딩 실패 시 반환할 값 디폴트 값은 빈 딕셔너리다. """ try: return json.loads(data) except ValueError: if default is None: default = {} return default foo = decode('잘못') foo['stuff'] = 5 bar = decode('잘못2') bar['meep'] = 1 print('Foo:', foo) print('Bar:', bar) >>> Foo: {'stuff': 5} Bar: {'meep': 1}
'Book > 파이썬 코딩의 기술' 카테고리의 다른 글
[BW 23] 키워드 인자로 선택적인 기능을 제공하라 (0) 2024.10.23 [BW 22] 변수 위치 인자를 사용해 시각적인 잡음을 줄여라 (0) 2024.10.23 [BW 21] 변수 영역과 클로저의 상호작용 방식을 이해하라 (0) 2024.10.23 [BW 20] None을 반환하기보다는 예외를 발생시켜라 (0) 2024.10.23 [BW 19] 함수가 여러 값을 반환하는 경우 절대로 네 값 이상을 언패킹하지 말라 (0) 2024.10.22 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)