책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/robust-python
요약
파이썬은 접근하기 쉽고 사용하기도 쉬운 장점이 있지만 자칫 하면 코드의 양이 방대해지기도 쉽다. 그리고 그에 따른 문제가 발생할 가능성이 높은데 이 책에서는 이를 방지하고 해결할 수 있는 방법을 알려준다. 타입을 정의하는 것을 시작으로 데이터 클래스, 클래스 등 파이썬이 제공하는 다양한 타입을 알아보고 이들의 사용법을 정리한다. 그리고 이 타입을 체킹하기 위한 다양한 도구를 소개한다.
확장성을 확보하기 위해 조합, 이벤트 주도 아키텍처, 플러그인도 알아보며, 소프트웨어의 안전망을 확보하기 위해 정적 분석, 테스트 전략, 인수 테스트, 속성 기반 테스트, 뮤테이션 테스트 등을 살펴본다.
이 책에서 다루는 내용
◆ 개발 생태계에서의 타입의 중요성
◆ 특정 의도 반영을 위한 타입 선택
◆ 확장성 있는 파이썬 만들기
◆ 코드베이스의 견고성 및 안전성 높이기
◆ 유지보수 문제 감지를 위한 코드 평가
◆ 린팅과 테스팅을 통한 코드베이스 안전망 구축
이 책의 대상 독자
지속 가능하며 유지 가능한 방식으로 본인의 코드를 발전시키고 싶은 모든 파이썬 개발자를 위한 책이다. 파이썬 프로그래밍 경험이 있어야 하며 파이썬 입문용으로는 적합하지 않다. 파이썬의 제어 흐름과 클래스를 이해하고 있어야 한다.
이 책의 구성
이 책은 크게 4부로 구성돼 있다.
제1부, 코드에 타입 어노테이션하기
먼저 파이썬의 타입 어노테이션(type annotation)을 설명한다. 타입은 모든 언어의 기초이지만 세부적으로 다뤄지지 않는 경향이 있다. 한 번 정해진 타입은 매우 구체적인 의도를 전달하기 때문에 중요하다. 타입 어노테이션과 특정 어노테이션(specific annotation)이 개발자에게 어떤 내용을 전달하는지 살펴본다. 또한 타입체커(typechecker)를 살펴보고 이것이 오류를 잡는 데 어떻게 도움이 되는지 알아본다.
제2부, 여러분만의 타입을 정하기
파이썬의 타입을 알아본 후 타입을 어떻게 생성하는지 살펴볼 것이다. 열거형(enumeration), 데이터 클래스 및 클래스를 자세히 다룬다. 그리고 타입 설계 방식 선택이 코드의 견고성에 미치는 영향도 알아본다.
제3부, 확장 가능한 파이썬
의도를 전달하는 법을 배운 뒤, 향후 개발자들이 강력한 기반을 바탕으로 코드를 효과적으로 변경하며 자신 있게 빌드하는 방법을 살펴본다.
제4부, 안전망의 설치
마지막으로 우리는 이후에 인수할 개발자들이 떨어져도 다치지 않을 안전망을 설치하는 방법을 알아본다. 본인의 사례에도 어려움 없이 적용할 수 있는 튼튼한 장치가 있다는 것을 알게 되면 개발자들도 자신감이 올라갈 것이다. 마지막으로 오류 발견에 도움이 되는 다양한 정적 분석 및 테스트 도구를 알아본다.
목차
목차
- 1장. 견고한 파이썬
- 견고성
- 견고성이 중요한 이유
- 여러분의 의도는 무엇인가?
- 비동기 소통
- 파이썬 코드에서 의도의 예시
- 컬렉션
- 반복 구문
- 최소 놀람의 원칙
- 마치며
- 견고성
- 2장. 파이썬 타입의 소개
- 타입이란?
- 기계적인 표현
- 의미적 표현
- 타입 시스템
- 강한 스펙트럼과 약한 스펙트럼
- 동적 타입과 정적 타입
- 덕 타이핑
- 마치며
- 타입이란?
- 3장. 타입 어노테이션
- 타입 어노테이션이란?
- 타입 어노테이션의 장점
- 자동 완성
- 타입 체커
- 연습: 버그 찾기
- 타입 어노테이션은 사용할 때
- 마치며
- 4장. 타입의 제어
- Optional 타입
- Union 타입
- 곱 타입과 합 타입
- Literal 타입
- Annotated 타입
- NewType
- Final 타입
- 마치며
- 5장. 컬렉션 타입
- 컬렉션의 어노테이션
- 동종 컬렉션과 이종 컬렉션
- TypedDict
- 새로운 컬렉션 생성
- 제네릭
- 기존 타입의 변경
- ABC처럼 쉽게
- 마치며
- 6장. 타입 체커의 커스터마이징
- 타입 체커의 설정
- mypy의 설정
- mypy 리포트
- mypy를 빠르게
- 기타 타입 체커
- Pyre
- Pyright
- 마치며
- 타입 체커의 설정
- 7장. 실용적 타입 체킹
- 트레이드오프
- 더 빠른 손익 분기
- 취약점 찾기
- 전략적으로 대상 코드를 잡아라
- 도구화에 의존하기
- 마치며
- 8장. 사용자 정의 타입: 열거형
- 사용자 정의 타입
- 열거형
- Enum
- 사용하지 않을 때
- 고급 사용법
- 자동 변수
- 플래그
- 정수형 변환
- 고유성
- 마치며
- 9장. 사용자 정의 타입: 데이터 클래스
- 데이터 클래스의 동작
- 사용법
- 문자열 변환
- 등가 비교
- 관계 비교
- 불변성
- 다른 타입과의 비교
- 데이터 클래스와 딕셔너리
- 데이터 클래스와 TypedDict
- 데이터 클래스와 namedtuple
- 마치며
- 10장. 사용자 정의 타입: 클래스
- 클래스 해부
- 생성자
- 불변 속성
- 깨진 불변 속성 피하기
- 불변 속성이 이익인 이유
- 불변 속성을 통한 커뮤니케이션
- 클래스의 소비
- 유지 보수자들은 어떻게?
- 캡슐화와 불변 속성의 유지 보수
- 캡슐화
- 데이터 접근의 보호
- 운영
- 마치며
- 클래스 해부
- 11장. 사용자 정의 인터페이스
- 자연스러운 인터페이스 설계
- 사용자처럼 생각하기
- 자연스런 상호작용
- 자연스런 상호작용의 실제
- 매직 메서드
- 컨텍스트 매니저
- 마치며
- 자연스러운 인터페이스 설계
- 12장. 하위 타입
- 상속
- 치환 가능성
- 설계 고려 사항
- 합성
- 마치며
- 13장. 프로토콜
- 타입 시스템 간의 관계
- 타입을 비워두거나 Any로 사용
- Union의 사용
- 상속의 사용
- 믹스인의 사용
- 프로토콜
- 프로토콜의 정의
- 고급 사용법
- 프로토콜의 합성
- 런타임 시 체크할 수 있는 프로토콜
- 프로토콜을 만족시키는 모듈
- 마치며
- 타입 시스템 간의 관계
- 14장. pydantic으로 런타임 체크
- 동적 설정
- pydantic
- 유효성 검사 도구
- 유효성 검사와 파싱
- 마치며
- 15장. 확장성
- 확장성이란?
- 재설계
- 개방-폐쇄의 원칙
- 개방-폐쇄 원칙의 위배
- 개방-폐쇄 원칙의 단점
- 마치며
- 확장성이란?
- 16장. 의존성
- 관계
- 의존성의 유형
- 물리적 의존성
- 논리적 의존성
- 일시적(시간적) 의존성
- 의존성의 시각화
- 시각화 패키지
- 임포트의 시각화
- 함수 호출의 시각화
- 의존성 그래프의 해석
- 마치며
- 17장. 조합 가능성
- 조합 가능성
- 정책과 메커니즘
- 더 작은 스케일로 구성
- 함수의 조합
- 데코레이터
- 알고리듬의 조합
- 마치며
- 18장. 이벤트 주도 아키텍처
- 동작 방식
- 단점
- 단일 이벤트
- 메시지 중개자가 있는 경우
- 관찰자 패턴
- 이벤트 스트리밍
- 마치며
- 동작 방식
- 19장. 플러그인
- 템플릿 메서드 패턴
- 전략 패턴
- 플러그인 아키텍처
- 마치며
- 20장. 정적 분석
- 린팅
- 사용자 정의 Pylint 플러그인 작성
- 플러그인의 분해
- 기타 정적 분석 도구
- 복잡도 분석 도구
- 보안 분석
- 마치며
- 린팅
- 21장. 테스트 전략
- 테스트 전략의 정의
- 테스트란?
- 테스트 비용 줄이기
- AAA 테스트
- 마치며
- 테스트 전략의 정의
- 22장. 인수 테스트
- 행위 주도 개발(BDD)
- 걸킨 언어
- 실행 가능 사양
- 추가적인 behave의 기능
- 단계의 파라미터화
- 테이블 주도 요구 사항
- 단계 매칭
- 테스트 수명주기의 사용자화
- 테스트의 선별적 수행을 위한 태그 사용
- 리포트 생성
- 마치며
- 행위 주도 개발(BDD)
- 23장. 속성 기반 테스트
- Hypothesis와 속성 기반 테스트
- Hypothesis의 마법
- 기존 테스트와의 비교
- Hypothesis의 최대한 활용
- Hypothesis 전략
- 알고리듬 생성
- 마치며
- Hypothesis와 속성 기반 테스트
- 24장. 뮤테이션 테스트
- 뮤테이션 테스트가란?
- mutmut을 이용한 뮤테이션 테스트
- 뮤턴트의 수정
- 뮤테이션 테스트 리포트
- 뮤테이션 테스트의 적용
- 커버리지의 오류(그리고 다른 메트릭)
- 마치며