- [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 26] functools.wrap을 사용해 함수 데코레이터를 정의하라 (0) 2024.10.25 [BW 25] 위치로만 인자를 지정하게 하거나 키워드로만 인자를 지정하게 해서 함수 호출을 명확하게 만들라 (0) 2024.10.24 [BW 23] 키워드 인자로 선택적인 기능을 제공하라 (0) 2024.10.23 [BW 22] 변수 위치 인자를 사용해 시각적인 잡음을 줄여라 (1) 2024.10.23 [BW 21] 변수 영역과 클로저의 상호작용 방식을 이해하라 (0) 2024.10.23 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)