지은이·옮긴이 소개 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
찾아보기 565