3. Functions

이 장에선 함수에 대해 다룬다.

19. Never unpack more than three variables when functions return multiple values.

  • 함수가 여러 개의 값을 리턴해야 한다면 tuple을 쓰고 호출자가 언패킹을 하도록 하라.
  • 함수의 복수 리턴값은 catch-all 별표 표현식으로 받을 수도 있다.
  • 4개 이상의 변수를 언패킹하는 것은 에러에 취약하고 지양되어야 한다. 작은 클래스나 namedtuple을 쓰라.

20. Prefer raising exceptions to returning None.

  • 특별한 사건을 전달하기 위해 None을 리턴하는 함수는 에러에 취약하다. None 뿐만 아니라 0이나 빈 문자열도 조건식에서 False로 평가되기 때문이다.
  • None을 반환하는 대신 특별한 경우에는 예외를 발생시키라. 예외를 문서화하고 호출하는 쪽에서 다루도록 하라.
  • 타입 어노테이션은 함수가 특별한 상황에서도 절대 None을 리턴하지 않음을 나타낼 수 있다.

21. Know how closures interact with variable scope.

  • 클로저 함수는 변수가 어떤 범위에 정의되어 있어도 그에 접근할 수 있다.
  • 기본적으로 클로저를 통해 변수에 대입을 함으로써 변수의 스코프 끝에 영향을 미칠 수는 없다.
  • nonlocal 명령어로 클로저가 변수의 스코프 끝 밖에서도 변수에 수정을 할 수 있도록 하라.
  • 간단한 함수가 아니라면 nonlocal은 피하라.

22. Reduce visual noise with variable positional arguments.

  • 함수는 def에 *args 를 통해 복수의 위치 인자를 받을 수 있다.
  • 시퀀스의 항목 또한 함수처럼 *args를 통해 위치 인자를 쓸 수 있다.
  • 제네레이터에 *를 쓰면 메모리 부족을 겪거나 크래시가 날 수 있다.
  • *args를 받는 함수에 새 위치 인자를 덧붙이는 건 감지하기 어려운 버그를 일으킬 수 있다.

23. Provide optional behavior with keyword arguments.

  • 함수 인자들은 위치나 키워드로 특정될 수 있다.
  • 키워드는 위치 인자만 있을 때와는 달리 각 인자의 목적을 명확히 한다.
  • 기본값을 가진 키워드 인자는 함수의 호출자를 전부 바꿀 필요 없이 함수의 확장을 쉽게 한다.
  • 선택적인 키워드 인자는 항상 위치 인자 대신 키워드 인자로 전달되어야 한다.

24. Use None and docstrings to specify dynamic default arguments.

  • 기본값 인자는 모듈 로딩 시 함수 정의부 시점에서 단 한 번만 평가되므로 동적인 값에 대해서는 이상한 동작을 할 수 있다.
  • 동적인 값을 가진 키워드 인자에 대해서는 None을 기본값으로 넣으라. 함수의 docstring에 이 키워드의 실제 요구 동작을 명시하라.
  • 키워드 인자의 기본값에 None을 넣는 것은 타입 어노테이션과도 맞게 동작한다.

25. Enforce clarity with keyword-only and positional-only arguments.

  • 키워드 한정 인자는 호출자에게 특정 인자를 키워드로만 부르게 해서 함수 호출의 의도를 명확히 한다. 키워드 한정 인자는 인자 리스트 내 * 이후로 정의된다.
  • 위치 한정 인자는 호출자에게 키워드를 통한 인자를 제공할 수 없게 해서 결합을 막는다. 위치 한정 인자는 인자 리스트 내 / 이후로 정의된다.
  • / 와 * 사이의 인자들은 위치 인자일 수도 있고 키워드 인자일 수도 있으며 Python 인자의 기본 설정이다.

26. Define function decorators with functools.wraps.

  • Python의 데코레이터는 함수가 다른 함수를 런타임에 수정할 수 있도록 한다.
  • 데코레이터를 사용하는 것은 디버거 등 내부를 관찰하는 툴들에서 이상한 동작을 보일 수 있다.
  • 커스텀 데코레이터를 쓸 때 이러한 문제들을 막기 위해서는 내장 모듈 functools의 wraps 데코레이터를 사용하라.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중