파이썬 3.11에 추가된 것들 살펴보기
- 프로그래밍 언어/파이썬
- 2024. 2. 17.
참고
TypedDict에 Required / Non-Required 인자 추가
from typing import TypedDict, Required, NotRequired
class Movie(TypedDict):
title: str
year: NotRequired[int]
m1: Movie = {"title": "Black Panther", "year": 2018} # OK
m2: Movie = {"title": "Star Wars"} # OK (year is not required)
m3: Movie = {"year": 2022} # ERROR (missing required field title)
타입 힌트를 위해 사용하는 TypedDict에 Required / NotRequired를 이용해 필수적이거나 선택적인 필드를 명시할 수 있도록 한다.
- 첫번째, 두번째는 필수인 title이 있음 → 통과
- 첫번째는 필수인 title이 없음 → 실패
타입 체크 시 동작한다.
타입 힌트 : Self Type
class MyLock:
def __enter__(self) -> Self:
self.lock()
return self
...
class MyInt:
@classmethod
def fromhex(cls, s: str) -> Self:
return cls(int(s, 16))
...
자기 자신을 반환할 때, 타입 힌트로 이제 Self를 사용할 수 있다.
asyncio 라이브러리 TaskGroup
파이썬 3.11에서 asyncio 라이브러리에 TaskGrooup 클래스가 추가되었다. TaskGroup 클래스는 비동기 context manager를 이용해 TaskGroup에 종속된 Task(코루틴)을 관리해주는 기능을 한다.
async def async_func(time):
print(f'async_func : {time}')
await asyncio.sleep(time)
print(f'end : {time}')
return time
async def amain():
sleep_times = [n for n in range(1, 3)]
coros = [asyncio.create_task(async_func(sleep_time)) for sleep_time in sleep_times]
result = await asyncio.gather(*coros)
>>>
async_func : 1
async_func : 2
end : 1
end : 2
기존에는 asyncio.create_task()로 코루틴을 만든 후, 코루틴이 완료될 때 까지 기다리도록 asyncio.gather()를 함께 사용했다.
async def async_func(time):
print(f'async_func : {time}')
await asyncio.sleep(time)
print(f'end : {time}')
return time
async def new_amain():
sleep_times = [n for n in range(1, 3)]
async with asyncio.TaskGroup() as tg:
[tg.create_task(async_func(sleep_time)) for sleep_time in sleep_times]
>>
>>>
async_func : 1
async_func : 2
end : 1
end : 2
TaskGroup을 함께 사용하면 create_task() + await gather()를 사용할 필요 없이 Asynchronous ContextManager를 이용해 깔끔하게 정리할 수 있다.
https://docs.python.org/ko/3.11/library/asyncio-task.html#asyncio.TaskGroup
functools.singledispatch()에 Union type 추가
from functools import singledispatch
from typing import Union
@singledispatch
def fun(arg, verbose=False):
if verbose:
print("Let me just say,", end=" ")
print(arg)
@fun.register
def _(arg: int | float, verbose=False):
if verbose:
print("Strength in numbers, eh?", end=" ")
print(arg)
@fun.register
def _(arg: Union[list, set], verbose=False):
if verbose:
print("Enumerate this:")
for i, elem in enumerate(arg):
print(i, elem)
@singledispatch 데코레이터에 함수를 등록할 때, 파라메터 타입으로 이제 typing.Union을 인식할 수 있게 되었다.
fun([1,2,3,4])
>>>
0 1
1 2
2 3
3 4
위 코드를 실행하면 다음 결과를 확인할 수 있다.