본문 바로가기
파이썬/진지한파이썬

[진지한파이썬] 프로젝트 시작하기

by 책 읽는 개발자_테드 2022. 5. 3.
반응형

진지한 파이썬의 내용을 요약 정리한 글입니다. 이 책은 제목과 같이 파이썬을 진지하게 다루는 책입니다. 저자가 15년이 넘는 세월 동안 쌓은 노하우를 얻어 파이썬이 가진 능력을 극대화하고, 잘 실행되는 프로그램을 만들기 위한 방법과 조언들을 담고 있습니다.

 

파이썬 소스 코드를 효율적으로 작성하는 방법을 더 잘 이해할 수 있도록 파이썬 내부를 살펴봅니다. 파이썬 내부에서 어떻게 소스 코드가 처리되는지 깊이 이해하여 개발할 때 생기는 문제나 비효율적인 상황을 잘 해결할 수 있도록 도와줍니다. 

 

파이썬 소스 코드, 애플리케이션, 라이브러리 테스트, 이식 ,확장 같은 문제에 대해 실무에서 입증된 해결 방법을 제공합니다. 이를 통해 다른 개발자가 경험한 실수를 피하고, 프로그램을 오랫동안 유지할 수 있는 전략을 익힐 수 있습니다.

 

목차

· 프로젝트 잘 설계하기

· 버전 번호 매기기

· 코딩 스타일과 자동 검사

· 인터뷰: 조슈아 할로와 파이썬


프로젝트 잘 설계하기


지켜야할 사항

· 프로젝트 구조를 위해 패키지와 계층 구조를 적절히 사용한다. 너무 많은 계층구조를 사용하면 소스 코드를 찾을 때 힘들고, 너무 단순한 구조를 사용하면 프로젝트를 구분하기 힘들며 구조가 비대해진다.

· 단위 테스트는 반드시 개발하고 있는 프로그램의 하위 패키지에 포함해야 한다. 그래야 setuptools 같은 패키징 라이브러리가 단위 테스트를 최상위 수준 모듈로 자동 설치하지 않는다.

- 단위 테스트를 하위 패키지에 포함해두면, 다른 패키지에서도설치해서 사용할 수 있다. 

 

일반적인 패키지 디렉터리 구조

· 파이썬 설치 스크립트의 표준 이름은 setup.py이며, 설치 스크립트 구성 세부 정보가 포함된 setup.cfg와 함께 제공된다. setup.py를 실행하면 파이썬 배포 유틸리티를 사용해서 패키지를 설치한다.

· doc 디렉터리에서 reStructuredText 형식으로 작성한 패키지 문서를 저장한다.

· 사용할 데이터(이미지, 셸 스크립트 등)파일을 저장하는 표준은 없기 떄문에 프로젝트 목적에 부합하는 위치에 저장한다.

ex) 루트 디렉터리 template에 웹 애플리케이션 템플릿 저장

· 패키지 루트에서 볼 수 있는 디렉터리:

- 설정 파일들을 위한 etc

- 셸 스크립트와 관련 도구들을 위한 tools

- setup.py로 설치할 실행 스크립트들이 위치하는 bin

 

금지 사항

· __init__.py파일만 있는 모듈 디렉터리를 만드는 것은 불필요하다. 디렉터리를 만들 땐, 그 디렉터리가 의미하는 여러 파일을 함께 저장한다.

· __init__.py 파일에 입력할 소스 코드는 매우 주의한다. 디렉터리에 포함된 모듈을 불러올 때, 가장 먼저 이 파일을 호출하고 실행하므로, 잘못된 내용이 있으면 의도하지 않은 오류가 생길 수 있다.

· 파이썬은 하위 모듈이라고 생각하는 디렉터리에 __init__.py 파일이 존재한다고 가정하므로, 해당 파일을 삭제하면 파이썬 모듈을 불러올 수 없다.

 

버전 번호 매기기


· 버전 번호를 구성하는 방법에는 제한이 없지만, PEP 440은 다른 프로그램과 패키지가 패키지 버전을 쉽고 안정적으로 구별하도록, 모든 파이썬 패키지와 애플리케이션이 따라야 하는 버전 형식을 명시한다.

 

· 버전 번호 매기기에 정규표현식을 정의한다.

[N!]N(.N)*[{a|b|rc}N][.postN][.devN]

- 버전 1.2는 1.2.0과 같고, 1.3.4는 1.3.4.0과 같다.

- N[.N)*와 일치하는 버전은 최종 릴리스로 간주한다.

- 날짜 기반 버전(예:2022.05.02)은 유효하지 않다. PEP440 형식 버전 번호를 감지하도록 설계된 자동화 도구가 1980 이상의 버전 번호를 감지하면 오류가 발생한다.

- N[.N]*aN(예:1.2a1)은 알파 버전으로, 불안정하고 누락된 기능이 있을 수 있다.

- N[.N]*bN(예:2.3.1b2)는 베타 버전으로, 기능이 완료되었지만 여전히 버그가 있을 수 있다.

- N[.N]*cN 또는 N[.N]*rcN(예: 0.4rc1)은 릴리스 후보를 나타낸다. 심각한 버그가 발생하지 않는 한 최종 제품으로 출시될 수 있다. rc와 r 접미어가 둘다 사용되면 rc 릴리스를 c릴리스보다 새로운 것으로 간주한다.

- .postN(예:1.4.post2)은 릴리스 후를 나타낸다. 일반적으로 릴리스 노트와 같은 출시 과정의 사소한 오류를 해결하는 데 사용된다.

- .devN(예:2.3.4.dev3)은 개발 릴리스를 나타낸다. 사람들이 알아보기 어려우므로 권장하지 않는다.

 

코딩 스타일과 자동 검사


· 파이선 개발자들은 PEP 8이라는 파이썬 스타일 가이드를 만들었다. 이는 파이썬 코드 작성을 위한 표준 스타일을 정의한다. 요약 내용은 다음과 같다.

- 들어쓰기는 4개의 공백을 사용한다.

- 모든 행은 최대 79자로 제한한다.

- 최상위 함수나 클래스 정의는 두 개의 빈 줄로 분리한다.

- ASCII 또는 UTF-8을 사용하여 파일을 인코딩하자.

- import 문은 한 라인에 하나만 쓰고, 한 import 문에서는 하나의 모듈만 가져온다.

- import 문은 문서 맨 위에 쓰되, 주석과 독스트링 다음에 쓴다. 

- 표준 라이브러리 import, 써드파티 import, 로컬라이브러리 import 순서로 그룹화한다. 

- 괄호, 대괄호, 중괄호 사이 또는 쉽표 앞에 불필요한 공백을 사용하지 않는다.

- 클래스 이름은 CamelCase로 작성한다. 예외는 실제 

- 함수명은 소문자로 구성된 snake_case로 작성한다.

 

· PEP 8 가이드와 맞는지 자동 검사 하는 pycoestyle이라는 도구가 존재한다.

- 설치:

$ pip install pycodestyle

 

- 사용법:

$ pycodestyle python_file_name.py

 

· PEP 8 가이드를 준수하면 지속석 통합(CI)으로 쉽게 이어질 수 있다. pycodestyle과 tox를 통합하여 검사를 자동화할 수 있다.

· 대부분의 오픈소스 프로젝트는 PEP 8을 준수하도록 자동화하여 관리한다.

· PEP 8을 사용하면 프로젝트를 구성하는 모든 소스 코드가 동일한 스타일을 갖게 할 수 있다.

 

· 새 프로젝트를 시작하면 코드 품질과 스타일을 자동으로 확인하는 도구를 사용하는 것이 좋다. 파이썬에서는 flake8이라는 도구가 도움이 될 수 있다. 

- flake8은 코딩 오류를 검사하는 Pyflakes와 PEP8 적합성을 처리하는 Pylint를 한 번에 실행할 수 있도록 만든 도구다.

- flake8에 자체 플러그인을 작성하여 except 문의 잘못된 사용, 파이써 2와 파이썬3의 호환성 문제, 스타일 가져오기, 위험한 문자열 형식, localization 가능성 등을 확인하기도 한다.

 

인터뷰: 조슈아 할로와 파이썬


· 조슈아 할로는 파이썬 개발자로 야후 오픈스택 팀 기술 책임자 출신이며, 다양한 파이썬 라이브러리의(태스크플로, 오토마톤, Zake) 개발자다.

 

파이썬 언어애서 좋아하는 점과 좋아하지 않는 점은?

· 좋아하는 점:

- 단순성: 초보자가 쉽게 입문할 수 있고, 숙력된 개바자도 계속 사용할 수 있다.

- 스타임 검사: 작성해둔 코드를 나중에 읽는 일은 소프트웨어 개발에서 큰 부분을 차지한다. flake8, pycodestyle, pylint 같은 도구로 일관성을 갖추는 것은 큰 도움이 된다.

- 프로그래밍 스타일을 원하는 대로 선택하고 조합할 수 있다.

 

· 싫어하는 점 

- 파이썬 2에서 3으로 전환이 조금 혼란스럽다.

- 람다는 너무 단순해서, 더 강력해져야 한다.

- 제대로 된 패키지 설치 프로그램이 없다. pip은 디펜던시 문제를 해결하는 개발이 필요한하다.

- 전역 인터프리터 락(GIL)이 필요하다.

- 멀티스레딩에 대한 지원이 부족하다. 현재는 asyncio 모델을 추가해서 작업해야 한다.

- 파이썬 커뮤니티가 분산되어 있다. ex) CPython, PyPy

 

파이썬에서 어떤 점이 부족하다고 생각하는가?

· JIT 컴파일이 필요하다.

- 최근 개발된 대부분의 언어는 파이썬 기능을 많이 가지고 있지만 JIT으로 컴파일 된다. ex) 크롬 V8 엔진을 사용하는 러스트, Node.js

- 기본 CPython도 JIT 컴파일하여 파이썬이 성능 면에서 새로운 언어와 경쟁할 수 있다면 좋을 것이다.

 

· 강력한 동시성 패틴이 필요하다.

- 낮은 수준의 비동기와 스레딩 스타일 패턴뿐만 아니라 더 큰 응용프로그램에서 작동하는 애플리케이션을 만드는 데 도움이 되는 높은 수준의 패턴이 필요하다.

- 파이썬 라이브러리 goless는 내장 동시성 모델을 제공하는 Go의 일부 개념을 포함한다. 이러한 상위 수준의 패턴이 표준 라이브러리에 내장되어 개발자들이 적합한 곳에 사용할 수 있도록 가장 먼저 패턴으로 유지되어야 한다. 이것이 없다면 파이썬은 다른 언어와 경쟁하기 어려울 것이다. 

반응형

댓글