# Stuart Ellis의 Python 현대적 모범 사례

> Clean Markdown view of GeekNews topic #15837. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15837](https://news.hada.io/topic?id=15837)
- GeekNews Markdown: [https://news.hada.io/topic/15837.md](https://news.hada.io/topic/15837.md)
- Type: news
- Author: [geniuskey](https://news.hada.io/@geniuskey)
- Published: 2024-07-14T22:36:18+09:00
- Updated: 2024-07-14T22:36:18+09:00
- Original source: [stuartellis.name](https://www.stuartellis.name/articles/python-modern-practices/)
- Points: 26
- Comments: 5

## Summary

이 기사는 Python 개발 시 최신 버전 사용과 다양한 도구 활용의 중요성을 강조합니다. 또한, 코드 형식 정리와 테스트, 패키징 등 프로젝트 개발의 모범 사례를 제시합니다. 마지막으로, 언어 문법과 애플리케이션 설계, 라이브러리 사용에 대한 구체적인 권장 사항을 제공합니다.

## Topic Body

### Modern Good Practices for Python Development  
  
[Stuart Ellis의 Python 현대적 모범 사례](https://www.stuartellis.name/articles/python-modern-practices/)에서는 Python 개발 시 고려해야 할 중요한 사항들을 다루고 있습니다. 주요 내용은 다음과 같습니다:  
  
#### Python 사용하기  
- 운영 체제에 내장된 Python 사용 피하기: 운영 체제에 내장된 Python은 오래된 버전일 수 있습니다.  
- 여러 버전을 지원하는 도구로 Python 설치: [pyenv](https://github.com/pyenv/pyenv) 또는 [mise](https://mise.jdx.dev)와 같은 도구 사용.  
- 최신 버전의 Python 사용: 보안 패치와 성능 향상을 위해 최신 안정 버전 사용.  
- 개발자 애플리케이션 실행에 pipx 사용: [pipx](https://pipx.pypa.io/)를 통해 격리된 환경에서 애플리케이션 실행.  
- 프로젝트 도구 사용: [PDM](https://pdm-project.org/), [Hatch](https://hatch.pypa.io/), [Mise](https://mise.jdx.dev), [Rye](https://rye-up.com/) 추천.  
  
#### Python 프로젝트 개발하기  
- 코드 형식 정리: [Ruff](https://docs.astral.sh/ruff/) 사용.  
- 코드 린팅: [Ruff](https://docs.astral.sh/ruff/) 추천.  
- [pytest](https://pytest.org/)로 테스트: 관련 플러그인([pytest-randomly](https://pypi.org/project/pytest-randomly/), [pytest-cov](https://pytest-cov.readthedocs.io/)) 사용.  
- 패키징: wheel 패키지 사용 및 필요한 경우 컨테이너 이미지 또는 [PyInstaller](https://pyinstaller.org/) 사용.  
  
#### 언어 문법  
- 타입 힌팅 사용: [PEP 484](https://peps.python.org/pep-0484/), [PEP 526](https://peps.python.org/pep-0526/).  
- f-문자열로 문자열 포맷: [PEP 498](https://www.python.org/dev/peps/pep-0498/).  
- 시간대 인식 datetime 객체 사용: [PEP 615](https://www.python.org/dev/peps/pep-0615/).  
  
#### 애플리케이션 설계  
- print() 대신 [logging](https://docs.python.org/3/library/logging.html) 사용.  
- 구성에 TOML 형식 사용: [PEP 680](https://peps.python.org/pep-0680/).  
- 비동기 I/O는 필요한 경우에만 사용.  
  
#### 라이브러리  
- [argparse](https://docs.python.org/3/library/argparse.html)로 명령줄 입력 처리.  
- [pathlib](https://docs.python.org/3/library/pathlib.html)로 파일 및 디렉터리 경로 처리.  
- os.listdir() 대신 빠르고 효율적 os.scandir() 사용: [PEP 471](https://www.python.org/dev/peps/pep-0471/).  
- 외부 명령 실행 시 subprocess 사용: [PEP 324](https://www.python.org/dev/peps/pep-0324/).  
- 웹 클라이언트로 [requests](https://requests.readthedocs.io/en/latest/) 대신 [httpx](https://www.python-httpx.org/) 사용.  
  
#### 프로젝트 모범 사례  
- `pyproject.toml` 파일 사용: [PEP 517](https://www.python.org/dev/peps/pep-0517/), [PEP 518](https://www.python.org/dev/peps/pep-0518/), [PEP 621](https://www.python.org/dev/peps/pep-0621/), [PEP 660](https://www.python.org/dev/peps/pep-0660/).  
- src 레이아웃 사용: [src 레이아웃과 평면 레이아웃 비교](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/).  
- 개발에 가상 환경 사용: [venv](https://docs.python.org/3/tutorial/venv.html), [PDM](https://pdm-project.org/), [Hatch](https://hatch.pypa.io/), [Mise](https://mise.jdx.dev) 추천.  
- 패키지 설치에 요구 사항 파일 사용: [pip-tools](https://pip-tools.readthedocs.io/)를 통한 [pip-compile](https://pip-tools.readthedocs.io/en/latest/#pip-compile) 또는 [uv](https://github.com/astral-sh/uv) 사용.  
  
더 자세한 내용은 [전체 글](https://www.stuartellis.name/articles/python-modern-practices/)을 참고하세요.  
.  
.   
   
   
   
  
### Hacker News의 Python Modern Practices 토론 요약  
  
[Python Modern Practices에 대한 Hacker News 토론](https://news.ycombinator.com/item?id=40860803)에서는 다양한 도구와 방법론에 대한 사용자 의견이 공유되었습니다:  
  
1. **UV 사용 추천**: UV를 사용하는 것이 빠르고 쉬우며, 문제 발생 시 지원도 잘 된다. by [screye](https://news.ycombinator.com/item?id=40860803)  
2. **Rye 언급**: Rye는 Python 인터프리터 핀닝과 다운로드를 지원하며, uv와의 통합이 예정되어 있다. by [rat87](https://news.ycombinator.com/item?id=40860803)  
3. **현재 도구의 간단함 강조**: Mamba 환경과 기본 pip로 문제가 없으며, 도구 변경 필요성을 느끼지 못한다. by [helsinki](https://news.ycombinator.com/item?id=40860803)  
4. **기본 도구 선호**: pip, venv, virtualenvwrapper를 사용해 대부분의 문제를 해결할 수 있다. by [throwadobe](https://news.ycombinator.com/item?id=40860803)  
5. **Pipenv 사용 옹호**: Pipenv는 완전한 솔루션으로 사용해왔으며, 더 널리 사용되지 않는 이유를 모르겠다. by [routerl](https://news.ycombinator.com/item?id=40860803)  
6. **Poetry의 문제점**: Poetry는 Git 커밋 버전 식별자를 추가하지 못하는 등의 문제로 실망했다. by [alisonatwork](https://news.ycombinator.com/item?id=40860803)  
7. **Conda와 Mamba**: Conda는 의존성 관리가 훨씬 강력하며, Mamba가 더 빠르다. by [wanderingmind](https://news.ycombinator.com/item?id=40860803)  
8. **Packaging 문제**: Python의 패키징 문제는 사회적 이유가 크며, 항상 문제가 될 것이다. by [jampekka](https://news.ycombinator.com/item?id=40860803)  
9. **Pyenv 대체 제안**: Mise는 Pyenv보다 빠르고 Node 프로젝트도 지원한다. by [odie5533](https://news.ycombinator.com/item?id=40860803)  
10. **Pydantic 모델과 데이터 클래스**: Pydantic 모델은 검증 기능이 강력하지만 느리고, 데이터 클래스는 가볍고 효율적이다. by [martinky24](https://news.ycombinator.com/item?id=40860803)  
  
  
자세한 내용은 [Hacker News 토론](https://news.ycombinator.com/item?id=40860803)을 참고하세요.

## Comments



### Comment 27251

- Author: kaydash
- Created: 2024-07-15T05:54:48+09:00
- Points: 1

라이브러리 경량화에 대한 내용은 없네요.   
miniconda3의 가상env를 사용하고 미사용 lib은 제거해서 portable하게 배포하는게 yarn과 같은 분산처리 시스템에서 더 좋은 성능을 보장했습니다.

### Comment 27249

- Author: savvykang
- Created: 2024-07-15T00:36:08+09:00
- Points: 1

왜 pip-tools나 uv를 사용해야 할까요? 현대적이라던가 좋다는 주장에 근거가 전혀 없네요

### Comment 27250

- Author: savvykang
- Created: 2024-07-15T00:51:36+09:00
- Points: 2
- Parent comment: 27249
- Depth: 1

pip 의존성 명시자(dependency specifier)에 해시를 포함해야하는 이유로 [현재 pip 동작상 빌드버전을 명시할 수 없는 문제](https://youtu.be/oGpyupM52IQ)가 있네요. 이런 맥락없이 지침만 나열하는 가이드는 별로 설득력이 없어 보입니다

### Comment 27305

- Author: jwseo
- Created: 2024-07-16T11:52:59+09:00
- Points: 1
- Parent comment: 27250
- Depth: 2

주로 어떤걸 사용하시나요??

### Comment 27310

- Author: savvykang
- Created: 2024-07-16T18:20:01+09:00
- Points: 1
- Parent comment: 27305
- Depth: 3

기존에는 pip freeze만으로 작업을 했었는데요, 윈도우/리눅스 지원 라이브러리만 선정해서 작업했었고 패치버전이 바뀌어서 발생한 문제는 아직 없었습니다. 그럼에도 불구하고 이제 문제를 알았으니 필요성은 이해하고 있고요, 다만 pip-tools나 uv가 좀더 성숙해졌을때 사용을 고려해볼 예정입니다
