프로덕션 레벨에서 파이썬을 파이썬답게 쓰기 위해 알아야 할 모든 것을 망라한 책. 최신 피처를 활용해 파이썬 애플리케이션을 구축, 유지보수, 패키징, 배포하는 방법을 깊숙이 살펴본다. 베테랑 개발자가 엄선한 베스트 프랙티스, 유용한 도구, 표준을 익힘으로써 파이썬 전문가에 한 걸음 더 가까워질 수 있다.
저자 정보
미하우 야보르스키( 저자)
10년 이상 다양한 프로그래밍 언어를 이용해 전문적으로 소프트웨어를 작성했다. 주로 웹 애플리케이션을 위한 고성능 분산 백엔드 서비스 코드를 만들었다. 소프트웨어 엔지니어에서 리드 소프트웨어 아키텍트까지 여러 기업에서 다양한 역할을 했다. 과거부터 지금까지 파이썬을 가장 선호한다.
타레크 지아데( 저자)
10년 이상 다양한 프로그래밍 언어를 이용해 전문적으로 소프트웨어를 작성했다. 주로 웹 애플리케이션을 위한 고성능 분산 백엔드 서비스 코드를 만들었다. 소프트웨어 엔지니어에서 리드 소프트웨어 아키텍트까지 여러 기업에서 다양한 역할을 했다. 과거부터 지금까지 파이썬을 가장 선호한다.
김모세( 번역자)
목차
지은이·옮긴이 소개 xi 기술 감수자 소개 xii 옮긴이 머리말 xiii 베타리더 후기 xv 감사의 글 xvii 이 책에 대하여 xviii
CHAPTER 1 파이썬의 현재 1 1.1 파이썬의 현재와 진행 상황 2 1.2 파이썬 2의 현재와 미래 3 1.3 최신 정보의 확인과 습득 5 __1.3.1 PEP 문서 6 __1.3.2 활성화된 커뮤니티 8 __1.3.3 기타 자료들 10 1.4 요약 12
CHAPTER 2 모던 파이썬 개발 환경 13 2.1 기술적 요구 사항 14 2.2 파이썬 패키징 생태계 15 __2.2.1 pip를 이용한 파이썬 패키지 설치하기 15 2.3 런타임 환경 격리 17 __2.3.1 애플리케이션 레벨 격리 vs. 시스템 레벨 격리 20 2.4 애플리케이션 레벨 환경 격리 22 __2.4.1 포어트리: 디펜던시 관리 시스템 24 2.5 시스템 레벨 환경 격리 29 __2.5.1 컨테이너화 vs. 가상화 31 __2.5.2 도커를 이용한 가상 환경 33 __2.5.3 베이그런트를 이용한 가상 개발 환경 52 2.6 유명한 생산성 도구들 54 __2.6.1 커스텀 파이썬 셸 55 __2.6.2 IPython 이용하기 56 __2.6.3 커스텀 스크립트 및 프로그램과 셸 연동하기 59 __2.6.4 인터랙티브 디버거 60 __2.6.5 기타 생산성 향상 도구 62 2.7 요약 64
CHAPTER 3 파이썬의 새로운 기능 65 3.1 기술 요구 사항 66 3.2 최근의 언어 추가 사항 66 __3.2.1 딕셔너리 병합 및 업데이트 연산자 67 __3.2.2 할당 표현식 72 __3.2.3 타입 힌팅 제네릭 76 __3.2.4 위치 전달만 가능한 매개변수 78 __3.2.5 zoneinfo 모듈 81 __3.2.6 graphlib 모듈 82 3.3 그다지 새롭지는 않지만 여전히 멋진 요소들 86 __3.3.1 breakpoint() 함수 86 __3.3.2 개발 모드 88 __3.3.3 모듈 레벨 __getattr__() 및 __dir__() 함수 90 __3.3.4 f-string을 이용한 문자열 서식 지정 91 __3.3.5 숫자 리터럴의 언더스코어 93 __3.3.6 secrets 모듈 93 3.4 미래에 관한 예상 95 __3.4.1 | 연산자를 이용한 유니언 타입 95 __3.4.2 구조적 패턴 매칭 96 3.5 요약 101
CHAPTER 4 파이썬과 다른 언어와의 비교 103 4.1 기술적 요구 사항 104 4.2 클래스 모델과 객체 지향 프로그래밍 104 __4.2.1 슈퍼클래스로의 접근 105 __4.2.2 다중 상속과 메서드 결정 순서 107 __4.2.3 클래스 인스턴스 초기화 113 __4.2.4 속성 접근 패턴 117 __4.2.5 디스크립터 118 __4.2.6 프로퍼티 125 4.3 동적 다형성 131 __4.3.1 연산자 오버로딩 132 __4.3.2 함수 및 메서드 오버로딩 139 4.4 데이터 클래스 143 4.5 함수형 프로그래밍 147 __4.5.1 람다 함수 149 __4.5.2 map(), filter(), reduce() 함수 151 __4.5.3 부분 객체와 부분 함수 154 __4.5.4 제너레이터 155 __4.5.5 제너레이터 표현식 156 __4.5.6 데커레이터 157 4.6 열거형 159 4.7 요약 162
CHAPTER 5 인터페이스, 패턴, 모듈성 163 5.1 기술적 요구 사항 164 5.2 인터페이스 165 __5.2.1 간단한 역사: zope.interface 167 __5.2.2 함수 애너테이션과 추상 베이스 클래스 이용하기 175 __5.2.3 타입 애너테이션을 통한 인터페이스 181 5.3 제어 반전과 디펜던시 주입 184 __5.3.1 애플리케이션의 통제 반전 186 __5.3.2 디펜던시 주입 프레임워크 사용하기 194 5.4 요약 200
CHAPTER 6 동시성 201 6.1 기술적 요구 사항 202 6.2 동시성이란 무엇인가? 202 6.3 멀티스레딩 204 __6.3.1 멀티스레딩이란? 205 __6.3.2 파이썬의 스레드 처리 방식 209 __6.3.3 언제 멀티스레딩을 사용해야 하는가? 210 __6.3.4 멀티스레드 애플리케이션 예시 213 6.4 멀티프로세싱 230 __6.4.1 내장 multiprocessing 모듈 233 __6.4.2 프로세스 풀 이용하기 237 __6.4.3 multiprocessing.dummy를 멀티스레딩 인터페이스로 이용하기 239 6.5 비동기 프로그래밍 240 __6.5.1 협력적 멀티태스킹과 비동기 I/O 241 __6.5.2 파이썬의 async/await 키워드 242 __6.5.3 비동기 프로그래밍의 실질적 예 247 __6.5.4 비동기가 아닌 코드와 async/future 통합하기 250 6.6 요약 254
CHAPTER 7 이벤트 주도 프로그래밍 255 7.1 기술적 요구 사항 256 7.2 이벤트 주도 프로그래밍이란 무엇인가? 256 __7.2.1 이벤트 주도 != 비동기 257 __7.2.2 GUI에서의 이벤트 주도 프로그래밍 258 __7.2.3 이벤트 주도 통신 261 7.3 이벤트 주도 프로그래밍의 다양한 스타일 263 __7.3.1 콜백 기반 스타일 263 __7.3.2 주체 기반 스타일 265 __7.3.3 토픽 기반 스타일 270 7.4 이벤트 주도 아키텍처 272 __7.4.1 이벤트와 메시지 큐 273 7.5 요약 276
CHAPTER 8 메타프로그래밍 요소들 277 8.1 기술적 요구 사항 278 8.2 메타프로그래밍이란 무엇인가? 278 8.3 데커레이터를 이용해 함수의 행동을 사용 전 수정하기 279 __8.3.1 한 단계 더: 클래스 데커레이터 281 8.4 클래스 인스턴스 생성 프로세스 가로채기 286 8.5 메타클래스 289 __8.5.1 일반적인 구문 290 __8.5.2 메타클래스 사용 예시 293 __8.5.3 메타클래스의 함정 297 __8.5.4 메타클래스의 대안으로 __init_subclass__() 메서드 이용하기 298 8.6 코드 생성 300 __8.6.1 exec, eval, compile 301 __8.6.2 추상 구문 트리 302 __8.6.3 임포트 훅 304 __8.6.4 파이썬에서의 유명한 코드 생성 사례 304 8.7 요약 307
CHAPTER 9 파이썬에 C와 C++ 연결하기 309 9.1 기술적 요구 사항 311 9.2 파이썬 확장 기능의 핵심인 C/C++ 311 9.3 파이썬 C 확장 기능 컴파일 및 로딩 312 9.4 확장 기능 이용의 필요성 314 __9.4.1 크리티컬 코드 섹션의 성능 개선 315 __9.4.2 다른 언어로 작성된 기존 코드 통합 316 __9.4.3 서드파티 다이내믹 라이브러리 통합 316 __9.4.4 효율적인 커스텀 데이터 타입 생성 317 9.5 확장 기능 작성 317 __9.5.1 순수한 C 확장 기능 319 __9.5.2 Cython을 이용한 확장 기능 작성 337 9.6 확장 기능 사용의 단점 343 __9.6.1 추가적인 복잡성 344 __9.6.2 보다 어려운 디버깅 345 9.7 확장 기능 없이 다이내믹 라이브러리와 인터페이싱하기 345 __9.7.1 ctypes 모듈 346 __9.7.2 CFFI 353 9.8 요약 355
CHAPTER 10 테스팅과 품질 자동화 357 10.1 기술적 요구 사항 358 10.2 테스트 주도 개발 원칙 359 10.3 pytest를 이용해 테스트 작성하기 362 __10.3.1 테스트 매개변수화 369 __10.3.2 pytest의 픽스처 372 __10.3.3 페이크 이용하기 381 __10.3.4 목과 unittest.mock 모듈 385 10.4 품질 자동화 389 __10.4.1 테스트 커버리지 390 __10.4.2 스타일 픽서와 코드 린터 394 __10.4.3 정적 타입 분석 397 10.5 돌연변이 테스팅 399 10.6 유용한 테스팅 유틸리티 406 __10.6.1 실제적인 데이터값 조작하기 406 __10.6.2 시간값 조작하기 407 10.7 요약 409
CHAPTER 11 파이썬 코드 패키징과 배포 411 11.1 기술적 요구 사항 412 11.2 라이브러리 패키징 및 배포 412 __11.2.1 파이썬 패키지 구조 413 __11.2.2 패키지 배포 유형 422 __11.2.3 패키지 등록 및 공개 427 __11.2.4 패키지 버저닝과 디펜던시 관리 429 __11.2.5 커스텀 패키지 설치 433 __11.2.6 네임스페이스 패키지 435 __11.2.7 패키지 스크립트와 엔트리 포인트 437 11.3 웹용 애플리케이션 및 서비스 패키징 441 __11.3.1 12요소 앱 방법론 442 __11.3.2 도커 활용하기 444 __11.3.3 환경 변수 다루기 446 __11.3.4 애플리케이션 프레임워크에서 환경 변수의 역할 450 11.4 스탠드얼론 실행 파일 생성 454 __11.4.1 스탠드얼론 실행 파일이 유용한 경우 455 __11.4.2 널리 알려진 도구들 456 __11.4.3 실행 파일 패키지에서 파이썬 코드의 보안 464 11.5 요약 465
CHAPTER 12 애플리케이션 동작과 성능 관측 467 12.1 기술적 요구 사항 468 12.2 에러와 로그 캡처 468 __12.2.1 파이썬 로깅 기초 469 __12.2.2 좋은 로깅 프랙티스 482 __12.2.3 분산 로깅 484 __12.2.4 사후 리뷰를 위한 에러 캡처 487 12.3 코드와 커스텀 지표 조사 490 __12.3.1 프로메테우스 이용 492 12.4 분산 애플리케이션 트레이싱 502 __12.4.1 Jaeger를 이용한 분산 트레이싱 505 12.5 요약 511
CHAPTER 13 코드 최적화 513 13.1 기술적 요구 사항 514 13.2 나쁜 성능을 발생시키는 일반적인 요소들 514 __13.2.1 코드 복잡도 515 __13.2.2 과도한 리소스 할당과 누수 519 __13.2.3 과도한 I/O와 블로킹 520 13.3 코드 프로파일링 521 __13.3.1 CPU 사용량 프로파일링 522 __13.3.2 메모리 사용량 프로파일링 530 13.4 적절한 데이터 구조를 선택하여 복잡도 줄이기 541 __13.4.1 리스트 검색하기 541 __13.4.2 집합 이용하기 542 __13.4.3 collections 모듈 이용하기 543 13.5 아키텍처 트레이드오프 활용하기 548 __13.5.1 휴리스틱과 근사 알고리즘 이용하기 548 __13.5.2 태스크 큐와 지연된 처리 이용하기 550 __13.5.3 확률적 데이터 구조 이용하기 553 __13.5.4 캐싱 555 13.6 요약 563