@@ -20,6 +20,7 @@ Python 프로젝트를 효율적으로 관리하려면 **Poetry** 또는 **UV**
2020- ** UV** : 빠르고 가벼운 패키지 관리 도구로, 기존 패키지 관리자보다 빠른 설치 속도를 제공한다.
2121
2222### 사용 예시
23+
2324``` bash
2425poetry init # 새 프로젝트 초기화
2526poetry add requests # 패키지 추가
@@ -28,10 +29,21 @@ poetry run python main.py # 가상 환경에서 실행
2829
2930## ** 타입 힌트(Type Hints) 활용**
3031
31- Python은 동적 타입 언어이지만, ** 타입 힌트를 활용하면 코드의 가독성을 높이고 버그를 줄일 수 있다.**
32+ | 타입 미사용 | 타입 힌트 사용 |
33+ | ---------------------------------- | ------------------------------------ |
34+ | 코드 가독성이 낮음 | 코드 가독성이 높아짐 |
35+ | 실행 중 오류를 발견해야 함 | 정적 분석을 통해 사전 오류 감지 가능 |
36+ | IDE 자동 완성 기능이 제한적 | IDE 자동 완성이 더 정확하게 동작 |
37+ | 협업 시 코드 이해가 어려울 수 있음 | 협업 시 타입이 명확하여 이해가 쉬움 |
38+
39+ Python에서는 타입을 명시하지 않아도 동작하지만, 제네릭과 타입 힌트를 사용하면 코드의 안정성과 가독성이 높아진다. 특히 대규모 프로젝트나 협업 시에는 타입 힌트가 필수적이다.
40+
41+ ### ** 타입 힌트(Type Hints) 활용**
42+
3243Python 3.5에서 도입.
3344
34- ### 타입 힌트 적용 예시
45+ #### 타입 힌트 적용 예시
46+
3547``` python
3648def add (x : int , y : int ) -> int :
3749 return x + y
@@ -40,28 +52,81 @@ def fetch_data(url: str) -> dict[str, str]:
4052 return {" data" : " example" }
4153```
4254
43- - 타입 힌트를 사용하면 코드 자동 완성과 정적 분석이 더 효과적으로 동작한다.
44- - ` mypy ` 같은 정적 분석 도구를 사용하면 타입 관련 오류를 미리 감지할 수 있다.
55+ ### ** 제네릭(Generic) 활용**
56+
57+ 제네릭(Generic)은 여러 가지 타입을 유연하게 처리할 수 있도록 도와준다. Python에서는 ` TypeVar ` 또는 Python 3.12부터 제공되는 ` [T] ` 문법을 이용하여 제네릭을 사용할 수 있다.
58+
59+ #### ** 제네릭 없이 타입을 지정한 경우**
60+
61+ ``` python
62+ class IntBox :
63+ def __init__ (self , value : int ) -> None :
64+ self .value = value
65+
66+ def get_value (self ) -> int :
67+ return self .value
68+ ```
69+
70+ ` IntBox ` 는 ` int ` 타입만 저장할 수 있다.
71+
72+ #### ** 제네릭을 활용한 코드 (Python 3.11 이하)**
73+
74+ ``` python
75+ from typing import TypeVar, Generic
76+
77+ T = TypeVar(" T" ) # 제네릭 타입 변수
78+
79+ class Box (Generic[T]):
80+ def __init__ (self , value : T) -> None :
81+ self .value = value
82+
83+ def get_value (self ) -> T:
84+ return self .value
85+ ```
86+
87+ ` Box ` 클래스는 여러 타입을 저장할 수 있다. (예: ` Box[int] ` , ` Box[str] ` , ` Box[float] ` )
88+
89+ #### ** Python 3.12에서 개선된 제네릭 문법**
90+
91+ ``` python
92+ class Box[T]: # TypeVar 없이 바로 사용 가능
93+ def __init__ (self , value : T) -> None :
94+ self .value = value
95+
96+ def get_value (self ) -> T:
97+ return self .value
98+ ```
99+
100+ ` T = TypeVar("T") ` 선언 없이 더 간결한 문법으로 제네릭 클래스를 작성할 수 있다.
101+
102+ 제네릭을 활용하면 타입의 유연성을 높이고 코드의 재사용성을 향상시킬 수 있다.
45103
46104## ** 코드 스타일 유지: Linter 및 Formatter 사용**
47105
48106일관된 코드 스타일을 유지하려면 ** Linter** 와 ** Formatter** 를 활용하는 것이 중요하다.
49107
50- - ** Linter (예: flake8, pylint)** : 코드의 잠재적인 오류와 스타일 위반 사항을 자동으로 감지한다.
51- - ** Formatter (예: black, ruff)** : 코드 스타일을 자동으로 일관되게 유지해준다.
108+ | 분류 | 역할 | 대표 도구 |
109+ | ------------------ | ---------------------------------- | -------------------------- |
110+ | ** Linter** | 코드 스타일 검사 및 오류 감지 | ` flake8 ` , ` pylint ` , ` ruff ` |
111+ | ** Formatter** | 코드 스타일 자동 정리 | ` black ` , ` ruff ` |
112+ | ** 정적 타입 체커** | 타입 오류 검사 및 타입 안정성 보장 | ` mypy ` |
52113
53114### 사용 예시
115+
54116``` bash
55117pip install black flake8
56118black my_script.py # 코드 자동 포맷팅
57119flake8 my_script.py # 코드 스타일 검사
58120```
59121
122+ 일부는 VSC 같은곳에서 Extensions으로 설치하여 사용도 가능하다.
123+
60124## ** ` unittest ` 대신 ` pytest ` 사용**
61125
62126Python의 기본 테스트 프레임워크인 ` unittest ` 보다 ** ` pytest ` ** 를 사용하는 것이 더 간편하고 강력하다.
63127
64128### ` pytest ` 사용 예시
129+
65130``` python
66131# test_example.py
67132
@@ -71,6 +136,7 @@ def add(x: int, y: int) -> int:
71136def test_add ():
72137 assert add(2 , 3 ) == 5
73138```
139+
74140``` bash
75141pytest test_example.py # 테스트 실행
76142```
0 commit comments