10. Collaboration

Python에서 다른 개발자와 협업을 더 쉽게 하는 방법들을 알아보자.

82. Know where to find community-built modules.

  • Python 패키지 인덱스(PyPI)는 Python 커뮤니티에서 만들어지고 유지 보수되는 풍부한 공용 패키지들을 담고 있다.
  • pip는 PyPI로부터 패키지를 설치할 수 있는 커맨드 라인 도구이다.
  • 대다수의 PyPI 모듈은 무료이며 오픈 소스 소프트웨어이다.

83. Use virtual environments for isolated and reproducible dependencies.

  • 가상 환경을 통해서 pip를 사용해 같은 기기에 충돌 없이 같은 패키지의 다른 버전들을 설치할 수 있다.
  • 가상 환경은 python -m venv로 만들어지고 source bin/activate로 활성화되어 deactivate로 비활성화된다.
  • 환경의 모든 요구 사항을 python3 -m pip freeze로 덤프할 수 있다. python3 -m pip install -r requirements.txt로 환경을 재현할 수 있다.

84. Write docstrings for every function, class, and module.

  • docstring을 이용해 모든 모듈, 클래스, 메소드, 함수를 문서화하라. 코드가 변경됨에 따라 이들도 업데이트하라.
  • 모듈에 대해: 모듈의 내용과 사용자들이 알아야 하는 중요한 클래스나 함수에 대해 소개하라.
  • 클래스에 대해: 클래스 선언부 뒤에 동작, 중요한 특성, 부분클래스 동작을 docstring에 문서화하라.
  • 함수와 메소드에 대해: def 선언부 뒤에 모든 인자, 반환값, 발생하는 예외, 그리고 다른 동작들을 docstring에 문서화하라.
  • 타입 주석을 사용한다면 docstring에 내 타입 주석에 이미 있는 정보는 중복될 수 있으므로 생략하라.

85. Use packages to organize modules and provide stable APIs.

  • Python의 패키지들은 다른 모듈을 담는 모듈이다. 패키지들은 코드를 분리된, 충돌 없는 네임스페이스를 통해 유일한 절대적인 모듈명으로 구조화할 수 있게 한다.
  • 단순 패키지는 __init__.py 파일을 다른 소스 파일을 담은 디렉토리에 추가함으로써 정의된다. 이 파일들은 디렉토리의 패키지의 자식 모듈이 된다. 패키지 디렉토리는 다른 패키지들을 포함할 수 있다.
  • __all__ 특수 특성 내의 공용으로 보여질 수 있는 이름들을 목록화함으로써 모듈에 대한 명시적인 API를 제공할 수 있다.
  • 패키지의 __init__.py에 있는 공용 이름들만을 임포트하거나 내부 한정 멤버들의 이름 맨 앞에 밑줄 문자를 씀으로써 패키지의 내부 구현을 숨길 수 있다.
  • 단일 팀이나 단일 코드베이스 내에서 협업하는 경우라면 명시적 API에 __all__을 쓰는 것은 아마도 불필요할 것이다.

86. Consider module-scoped code to configure development environments.

  • 프로그램은 종종 각각이 고유한 가정과 환경 설정을 가진 복수의 배포 환경에서 실행될 필요가 있다.
  • 모듈 스코프 내에서 일반적인 Python 명령문을 사용해 모듈의 내용을 서로 다른 배포 환경에 맞출 수 있다.
  • 모듈의 내용은 sys와 os 모듈을 통한 호스트의 자가 조사 등을 통한 외부 조건의 산물일 수 있다.

87. Define a root exception to insulate callers from APIs.

  • 모듈에 대한 기본 예외를 정의하는 것은 API 소비자들이 그들을 API로부터 분리할 수 있게 한다.
  • 기본 예외를 잡는 것은 API를 사용하는 코드 내의 버그를 찾는 데 도움을 준다.
  • Python의 Exception 기반 클래스를 잡는 것은 API 구현의 버그를 찾는 데 도움을 준다.
  • 중간 기본 예외들은 API 소비자들을 깨지 않고 미래에 발생할 수 있는 특정한 예외들을 추가할 수 있도록 해 준다.

88. Know how to break circular dependencies.

  • 순환 의존성은 두 모듈이 임포트 시점에 서로를 호출해야만 할 때 발생한다. 이는 프로그램이 시작 시점에 중단하게 만들 수 있다.
  • 순환 의존성을 깨는 최고의 방법은 상호 의존성을 의존성 트리의 맨 아래쪽의 독립된 모듈로 리팩토링하는 것이다.
  • 동적 임포트는 리팩토링과 복잡도를 최소화하면서도 모듈간의 순환 의존성을 깨는 가장 간단한 방법이다.

89. Consider warnings to refactor and migrate usage.

  • warnings 모듈은 API의 호출자에게 더 이상 사용되지 않는 용법에 대해 공지하는 데 쓸 수 있다. 경고 메시지는 호출자들에게 차후의 변경 사항들이 그들의 프로그램을 깨기 이전에 그들의 코드를 고칠 수 있도록 유도한다.
  • Python 인터프리터의 커맨드 라인 인자에 -W error를 줘서 경고들을 에러로 발생시켜라. 이들은 자동화된 테스트에서 잠재적인 의존성 회귀를 잡는 데 특히 유용하다.
  • 제품 코드에서는 경고를 로깅 모듈에 복제해서 존재하는 에러 보고 시스템이 런타임에 경고를 잡을 것이라는 것을 보장할 수 있다.
  • 코드가 발생시키는 경고에 대한 테스트를 써서 그들이 하방 의존성 내에 올바른 시점에서 발생하는지를 보장하는 것이 좋다.

90. Consider static analysis via typing to obviate bugs.

  • Python은 변수, 필드, 함수, 메소드에 타입 정보를 주석화하기 위한 특별한 문법과 typing 내장 모듈을 가지고 있다.
  • 정적 타입 체커는 타입 정보를 활용해 런타임에 발생할 수 있는 다수의 흔한 버그를 피하는 데 움을 줄 수 있다.
  • 프로그램에서 타입을 채택해 API 내에서 활용하는 최고의 습관들은 여러 가지가 있다. 그러나 생산성에 방해가 되지 않도록 보장하라.

답글 남기기

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

WordPress.com 로고

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

Google photo

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

Twitter 사진

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

Facebook 사진

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

%s에 연결하는 중