Created at : 2024-11-18 01:45
Auther: Soo.Y
πλ©λͺ¨
Python 3.11
1. μμΈ κ·Έλ£Ήκ³Ό except*
ꡬ문 (PEP 654)
λΉλκΈ° νλ‘κ·Έλλ°μ΄λ λ³λ ¬ μ²λ¦¬μμ μ¬λ¬ μμΈκ° λμμ λ°μν μ μμ΅λλ€. Python 3.11μμλ μ΄λ¬ν μ¬λ¬ μμΈλ₯Ό νλμ μμΈ κ·Έλ£ΉμΌλ‘ λ¬Άμ μ μλ ExceptionGroup
μ΄ λμ
λμμ΅λλ€.
# μ¬λ¬ μμΈλ₯Ό ν¬ν¨ν μμΈ κ·Έλ£Ή μμ±
exc_group = ExceptionGroup("μ¬λ¬ μλ¬ λ°μ", [
ValueError("μλͺ»λ κ°μ
λλ€."),
TypeError("νμ
μ΄ λ§μ§ μμ΅λλ€."),
ZeroDivisionError("0μΌλ‘ λλ μ μμ΅λλ€.")
])
try:
raise exc_group
except* ValueError as e:
print(f"ValueError μ²λ¦¬: {e}")
except* TypeError as e:
print(f"TypeError μ²λ¦¬: {e}")
except* Exception as e:
print(f"κΈ°ν μμΈ μ²λ¦¬: {e}")
except*
ꡬ문μ μμΈ κ·Έλ£Ήμμ ν΄λΉ μμΈ νμ μ λ§€μΉλλ μμΈλ€μ μ²λ¦¬ν©λλ€.e.exceptions
λ μ²λ¦¬λ μμΈλ€μ 리μ€νΈλ₯Ό μ 곡ν©λλ€.- μ²λ¦¬λμ§ μμ μμΈλ λ€μ μμΈ κ·Έλ£ΉμΌλ‘ λ¬Άμ¬ μ νλ©λλ€.
- μ΄ κΈ°λ₯μ 볡μ‘ν μμΈ μ²λ¦¬λ₯Ό λ¨μννκ³ , λΉλκΈ° μ½λμμμ μμΈ κ΄λ¦¬λ₯Ό λμ± ν¨μ¨μ μΌλ‘ λ§λ€μ΄μ€λλ€.
2. μ±λ₯ ν₯μ
Python 3.11μ λ΄λΆ μ΅μ νλ₯Ό ν΅ν΄ μ λ°μ μΌλ‘ μ€ν μλλ₯Ό ν¬κ² ν₯μμμΌ°μ΅λλ€. λλΆλΆμ μ½λμμ 10~60%μ μ±λ₯ κ°μ μ κΈ°λν μ μμ΅λλ€.
import time
def compute():
total = 0
for i in range(1_000_000):
total += i
return total
start_time = time.time()
result = compute()
end_time = time.time()
print(f"κ²°κ³Ό: {result}")
print(f"μ€ν μκ°: {end_time - start_time} μ΄")
3. asyncio
λͺ¨λμ κ°μ : TaskGroup
ν΄λμ€
λΉλκΈ° μμ
μ κ·Έλ£Ήννκ³ κ΄λ¦¬νκΈ° μν TaskGroup
ν΄λμ€κ° μΆκ°λμμ΅λλ€.
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"μμ
{name} μλ£")
async def main():
async with asyncio.TaskGroup() as tg:
tg.create_task(task("A", 2))
tg.create_task(task("B", 1))
print("λͺ¨λ μμ
μλ£")
asyncio.run(main())
μΆλ ₯:
μμ
B μλ£
μμ
A μλ£
λͺ¨λ μμ
μλ£
asyncio.TaskGroup()
μ μ¬μ©νλ©΄ μ¬λ¬ λΉλκΈ° μμ μ ν κ·Έλ£ΉμΌλ‘ λ¬Άμ΄ κ΄λ¦¬ν μ μμ΅λλ€.async with
λΈλ‘μ΄ μ’ λ£λ λκΉμ§ κ·Έλ£Ή λ΄μ λͺ¨λ μμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦½λλ€.- μμ μ€ νλμμ μμΈκ° λ°μνλ©΄ κ·Έλ£Ή λ΄μ λ€λ₯Έ μμ λ€λ μ·¨μλ©λλ€.
4. νμ νν κ°μ
4.1 Self
νμ
(PEP 673)
ν΄λμ€ λ©μλμ λ°ν νμ
μ μ μν λ Self
νμ
μ μ¬μ©ν μ μκ² λμμ΅λλ€. μ΄λ λ©μλ 체μ΄λμ΄λ μλΈν΄λμ±μμ νμ
νλ©μ λμ± μ ννκ² λ§λ€μ΄μ€λλ€.
from typing import Self
class Shape:
def set_color(self, color: str) -> Self:
self.color = color
return self
class Circle(Shape):
def set_radius(self, radius: float) -> Self:
self.radius = radius
return self
circle = Circle().set_color("red").set_radius(5.0)
set_color
μset_radius
λ©μλλSelf
νμ μ λ°ννμ¬ λ©μλ 체μ΄λμ΄ κ°λ₯νκ² ν©λλ€.Self
λ νμ¬ μΈμ€ν΄μ€μ νμ μ μλ―Ένλ―λ‘, μλΈν΄λμ± μμλ μ νν νμ μ 보λ₯Ό μ 곡ν©λλ€.
4.2 typing.LiteralString (PEP 675)
보μκ³Ό κ΄λ ¨λ ν¨μμ 리ν°λ΄ λ¬Έμμ΄λ§ νμ©νλλ‘ LiteralString νμ μ΄ μΆκ°λμμ΅λλ€.
from typing import LiteralString
def safe_format(template: LiteralString, /, **kwargs):
return template.format_map(kwargs)
# μ¬λ°λ₯Έ μ¬μ©
result = safe_format("μλ
νμΈμ, {name}λ!", name="νκΈΈλ")
print(result) # μΆλ ₯: μλ
νμΈμ, νκΈΈλλ!
# μλͺ»λ μ¬μ©
user_input = "{name}λμ΄ λ‘κ·ΈμΈνμ΅λλ€."
# λ€μ μ€μ νμ
κ²μ¬κΈ°μμ μ€λ₯λ₯Ό λ°μμν΅λλ€.
# result = safe_format(user_input, name="νκΈΈλ")
LiteralString
νμ μ ν¨μ μΈμλ‘ λ¦¬ν°λ΄ λ¬Έμμ΄λ§ λ°λλ‘ μ νν©λλ€.- μΈλΆ μ λ ₯μ΄λ λ³μμ μ μ₯λ λ¬Έμμ΄μ μΈμλ‘ μ λ¬νλ©΄ νμ κ²μ¬κΈ°μμ μ€λ₯λ₯Ό λ°μμν΅λλ€.
- μ΄λ ν¬λ§· λ¬Έμμ΄ κ³΅κ²©κ³Ό κ°μ 보μ μ·¨μ½μ μ λ°©μ§νλ λ° λμμ΄ λ©λλ€.
5. TOML νμ (tomllib
) μΆκ° (PEP 680)
Python νμ€ λΌμ΄λΈλ¬λ¦¬μ TOML νμΌμ νμ±ν μ μλ tomllib
λͺ¨λμ΄ μΆκ°λμμ΅λλ€.
import tomllib
with open('config.toml', 'rb') as f:
config = tomllib.load(f)
print(config)
config.toml
νμΌ
[database]
user = "admin"
password = "secret"
host = "localhost"
port = 3306
μΆλ ₯
{
'database':
{
'user': 'admin',
'password': 'secret',
'host': 'localhost',
'port': 3306
}
}
tomllib.load()
λ₯Ό μ¬μ©νμ¬ TOML νμμ νμΌμ λμ λλ¦¬λ‘ νμ±ν μ μμ΅λλ€.- μ΄μ λ³λμ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μμ΄λ TOML νμΌμ μμ½κ² μ²λ¦¬ν μ μμ΅λλ€.
7 dataclasses
λͺ¨λμ slots
μ§μ (PEP 681)
dataclasses.dataclass
λ°μ½λ μ΄λμ slots=True
μ΅μ
μ μΆκ°νμ¬ μλμΌλ‘ __slots__
λ₯Ό μμ±ν μ μμ΅λλ€.
slots
μ μ¬μ©νμ§ μμ κ²½μ°
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
p = Person(name="John", age=30)
p.new_attr = "Oops!" # μλ‘μ΄ μμ± μΆκ° κ°λ₯
slots
μ μ¬μ©ν κ²½μ°
from dataclasses import dataclass
@dataclass(slots=True)
class Person:
name: str
age: int
p = Person(name="John", age=30)
# p.new_attr = "Oops!" # AttributeError λ°μ: 'Person' κ°μ²΄μ 'new_attr' μμ±μ μΆκ°ν μ μμ΅λλ€.
slotsλ₯Ό μ¬μ©νλ μ΄μ
- μ±λ₯ μ΅μ ν: λ§μ μΈμ€ν΄μ€λ₯Ό μμ±νκ±°λ μμ±μ μμ£Ό μ κ·Όνλ κ²½μ° μ±λ₯μ΄ ν₯μλ©λλ€.
- λ©λͺ¨λ¦¬ μ μ½: λ©λͺ¨λ¦¬ μλΉκ° κ°μνμ¬ λ©λͺ¨λ¦¬ ν¨μ¨μ΄ λμμ§λλ€.
μ νμ¬ν
- μ μ°μ± κ°μ:
slots
λ₯Ό μ¬μ©νλ©΄ μ μΈλ μμ± μΈμ μλ‘μ΄ μμ±μ μΆκ°ν μ μκΈ° λλ¬Έμ μ μ°μ±μ΄ λ€μ κ°μν©λλ€. - λ€μ€ μμ μ ν:
slots
λ₯Ό μ¬μ©ν ν΄λμ€λ λ€μ€ μμμμ μ νμ΄ μμ μ μμ΅λλ€.