파이썬 3.11에 추가된 것들 살펴보기

     

    참고

     

     


    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를 이용해 필수적이거나 선택적인 필드를 명시할 수 있도록 한다. 

    1. 첫번째, 두번째는 필수인 title이 있음 → 통과
    2. 첫번째는 필수인 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

    위 코드를 실행하면 다음 결과를 확인할 수 있다.

    댓글

    Designed by JB FACTORY