• 티스토리 홈
  • 프로필사진
    31514
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
31514
  • 프로필사진
    31514
    • 분류 전체보기 (105)
      • Book (66)
        • Learning SQL (9)
        • SQL 레벨업 (8)
        • 견고한 데이터 엔지니어링 (5)
        • 운영체제 (2)
        • 스파크 완벽 가이드 (9)
        • 파이썬 코딩의 기술 (29)
        • 분산 컴퓨팅 (4)
      • 개발 (23)
      • 기타 (10)
        • 출퇴근 공부 간단 정리 (7)
      • ELK (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
      • 31514의 이전 블로그는 여기로!
      등록된 공지가 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • [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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바