Skip to content

Commit 187e63a

Browse files
committed
Update Whats new in Python.md
1 parent 73dca65 commit 187e63a

File tree

1 file changed

+79
-8
lines changed

1 file changed

+79
-8
lines changed

docs/Whats new in Python.md

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ Python에서는 기존의 가장 큰 단점으로 꼽히던 속도 개선을 위
1717
많은 프로젝트에서 패키지 종속성을 관리할 때 `requirements.txt`를 사용하지만, Python에서는 공식적으로 `pyproject.toml`을 사용하는 것이 권장된다.
1818

1919
#### `requirements.txt`의 문제점
20+
2021
1. **공식 표준이 아님**: `requirements.txt`는 관습적으로 사용된 파일일 뿐, Python의 공식 표준이 아니다.
2122
2. **의존성 관리의 불편함**: `dev-requirements.txt`, `test-requirements.txt` 등 별도의 파일을 만들어야 하므로 관리가 번거롭다.
2223

2324
#### `pyproject.toml`을 사용하면?
25+
2426
1. **PEP 518 표준을 따르는 공식적인 방식**으로 관리할 수 있다.
2527
2. **환경별 의존성 관리가 가능**하여 개발 환경과 배포 환경을 쉽게 구분할 수 있다.
2628

2729
#### 사용 예시
30+
2831
```toml
2932
[tool.poetry]
3033
name = "my_project"
@@ -44,43 +47,109 @@ black = "^22.6.0"
4447

4548
패키지를 설치할 때는 `pip install .` 또는 `poetry install`을 사용한다.
4649

50+
### Self Type Hint 도입
51+
52+
Self 타입은 현재 클래스의 인스턴스 타입을 명시적으로 나타내는 타입 힌트이다.
53+
54+
기존에는 클래스 내부에서 자기 자신의 인스턴스를 반환하는 메서드를 작성할 때, 반환 타입을 클래스 이름을 직접 사용해야 했다. 그러나 이는 상속 관계에서 문제가 될 수 있다. Self를 사용하면 현재 클래스의 정확한 타입을 반환하도록 설정할 수 있다.
55+
56+
#### 기존 방식 (python < 3.11)
57+
58+
```python
59+
from typing import TypeVar, Type
60+
61+
T = TypeVar("T", bound="MyClass")
62+
63+
class MyClass:
64+
def my_method(self: T) -> T:
65+
return self
66+
```
67+
68+
#### 신규 방식
69+
70+
```python
71+
from typing import Self
72+
73+
class MyClass:
74+
def my_method(self) -> Self:
75+
return self
76+
```
77+
78+
- Self는 현재 클래스의 인스턴스를 반환하는 메서드에 적합한 타입 힌트이다.
79+
- 메서드 체이닝, 상속 관계에서의 반환 타입 유지, 컨텍스트 매니저 구현 등에 유용하다.
80+
81+
#### 상속 예시
82+
83+
```python
84+
from typing import Self
85+
86+
class Base:
87+
def copy(self) -> Self:
88+
return self.__class__() # 새로운 인스턴스를 생성하여 반환
89+
90+
class Derived(Base):
91+
pass
92+
93+
base_instance = Base()
94+
derived_instance = Derived()
95+
96+
print(isinstance(base_instance.copy(), Base)) # True
97+
print(isinstance(derived_instance.copy(), Derived)) # True
98+
```
99+
47100
## **Python 3.12**
48101

49102
### 새로운 문법 추가 (PEP 701, f-string 개선)
50103

51104
기존 f-string의 제한을 완화하여 더욱 강력하게 사용할 수 있도록 개선되었다.
52105

53106
#### 개선된 사항
107+
54108
1. 같은 따옴표(`'` 또는 `"` )를 재사용할 수 있다.
55109
2. 여러 줄 표현과 주석을 지원한다.
56110
3. 백슬래시(\) 및 유니코드 문자를 사용할 수 있다.
57111
4. 에러 메시지가 더욱 명확하게 제공된다.
58112

59-
#### 예제 코드
60113
```python
114+
# 1. 같은 따옴표 재사용 가능
61115
songs = ["Take me back to Eden", "Alkaline", "Ascensionism"]
62116
print(f"This is the playlist: {', '.join(songs)}")
117+
# Python 3.11에서는 같은 따옴표(' 또는 ")를 내부에서 사용할 수 없었음 → 이제 가능!
63118

119+
# 2. 여러 줄 표현과 주석 사용 가능
64120
playlist = f"""
65121
This is the playlist: {", ".join([
66-
"Take me back to Eden", # 첫 번째 곡
67-
"Alkaline", # 두 번째 곡
68-
"Ascensionism" # 세 번째 곡
122+
"Take me back to Eden", # 좋아하는 곡 1
123+
"Alkaline", # 좋아하는 곡 2
124+
"Ascensionism" # 좋아하는 곡 3
69125
])}
70126
"""
71-
print(playlist)
127+
print(playlist) # 여러 줄에 걸쳐 표현 가능 + 주석도 가능!
128+
129+
# 3. 백슬래시와 유니코드 문자 사용 가능
130+
print(f"This is the playlist: {'\n'.join(songs)}")
131+
# 줄 바꿈을 f-string 내부에서 사용할 수 있게 됨
132+
133+
print(f"This is the playlist: {'\N{BLACK HEART SUIT}'.join(songs)}")
134+
# 유니코드 문자 (♥)도 정상적으로 표현됨
135+
136+
# 4. 에러 메시지가 더 정확하게 표시됨
137+
my_string = f"{x z y}" + f"{1 + 1}"
138+
# Python 3.11 → 에러 메시지가 명확하지 않음
139+
# Python 3.12 → 에러 발생한 위치가 더 정확하게 표시됨
72140
```
73141

74142
### 새로운 타입 어노테이션 추가 (PEP 695)
75143

76144
Python 3.12에서는 제네릭(Generic) 타입을 보다 간결하게 정의할 수 있도록 개선되었다.
77145

78146
#### 개선된 사항
147+
79148
1. `TypeVar`을 선언할 필요 없이 `[T]`를 바로 사용할 수 있다.
80149
2. `type` 키워드를 활용하여 타입 별칭(Alias)을 선언할 수 있다.
81-
3. Bound 및 Constraints 적용이 더욱 간결해졌다.
82150

83151
#### 예제 코드
152+
84153
```python
85154
def max[T](args: Iterable[T]) -> T:
86155
return max(args)
@@ -104,6 +173,7 @@ type IntOrStrSequence[T: (int, str)] = Sequence[T]
104173
기존 Python은 GIL(Global Interpreter Lock)로 인해 멀티코어를 활용하기 어려웠다. Python 3.13에서는 실험적으로 GIL을 비활성화할 수 있는 Free-threaded 모드가 추가되었다.
105174

106175
#### 주요 특징
176+
107177
- 기본적으로 GIL이 활성화되어 있지만, `python3.13t` 실행 파일을 사용하면 GIL 없이 실행할 수 있다.
108178
- 실행 방법:
109179
```bash
@@ -113,6 +183,7 @@ type IntOrStrSequence[T: (int, str)] = Sequence[T]
113183
- 현재는 실험적인 기능이며 일부 성능 저하가 있을 수 있다.
114184

115185
#### GIL 상태 확인 방법
186+
116187
```python
117188
import sys
118189
print(sys._is_gil_enabled()) # False면 GIL이 비활성화된 상태
@@ -123,6 +194,7 @@ print(sys._is_gil_enabled()) # False면 GIL이 비활성화된 상태
123194
Python 3.13에서는 JIT 컴파일러가 실험적으로 추가되어 실행 속도를 향상시킬 수 있다.
124195

125196
#### 주요 특징
197+
126198
- 자주 실행되는 바이트코드를 기계어로 변환하여 실행 속도를 높인다.
127199
- 실행 방법:
128200
```bash
@@ -135,5 +207,4 @@ Python 3.13에서는 JIT 컴파일러가 실험적으로 추가되어 실행 속
135207

136208
## 결론
137209

138-
Python 3.11부터 3.13까지 지속적인 성능 개선과 새로운 기능이 추가되었다. 특히, f-string 개선, 타입 어노테이션 간소화, GIL 제거 지원, JIT 컴파일러 도입 등이 주목할 만하다. 이러한 변화들을 적극 활용하면 상황에 맞게 더욱 효율적인 Python 코드를 작성할 수 있다.
139-
210+
Python 3.11부터 3.13까지 지속적인 성능 개선과 새로운 기능이 추가되었다. 이러한 변화들을 적극 활용하면 상황에 맞게 더욱 효율적인 Python 코드를 작성할 수 있다.

0 commit comments

Comments
 (0)