Python/Utils

파이썬 class __init__에서 async로 변수 초기화 하는 방법

jimmy_AI 2024. 2. 20. 22:53
반응형

Python에서 클래스를 구현할 때, 선언부인 __init__에서

비동기 함수에서 변수를 가져와 초기화하고 싶은 경우가 있습니다.

 

이 경우, __init__은 async로 직접 구현은 불가하지만,

이를 우회할 수 있는 방법이 있어 간략하게 정리해보도록 하겠습니다.

 

 

__init__에서 비동기 선언이 필요한 코드 예시

다음과 같은 class가 있다고 가정해보도록 하겠습니다.

여기에서는 class의 value 속성에서 필요한 값을 불러와야 합니다.

### 

async def load_from_some_async_function(): # 비동기 함수를 불러와야 하는 상황
    # do something
    
###

class AsyncInitClass:
    def __init__(self): # async가 불가능!
        self.value = await load_from_some_async_function() # await가 불가능!

 

여기서 비동기 함수인 load_from_some_async_function의 호출이 필요한데요.

선언부는 async def가 불가능하여 위와 같은 방식으로는 코드를 작성할 수 없습니다.

 

 

클래스 선언부 비동기 함수로 초기화 우회 코드 예시

이를 우회할 수 있는 좋은 방법은

별도의 async 함수로 self.value 값을 지정하도록 만들고, 

클래스 선언 이후 적절한 위치에서 해당 함수를 실행하도록 하는 것입니다.

 

예시 코드는 다음과 같습니다. 여기서는 asyncio 모듈을 활용하여

비동기 함수 실행을 돕도록 하였습니다.

import asyncio

class AsyncInitClass:
    def __init__(self):
        self.value = None

    async def load_values(self):
        self.value = await load_from_some_async_function() # 여기서 간접 선언
        
my_class = AsyncInitClass()
asyncio.run(my_class.load_values()) # asyncio를 통한 비동기 함수 실행

 

위와 같이 값을 별도의 비동기 함수로 따로 가져오면

my_class.value 속성에 값이 잘 부여된 것을 확인할 수 있습니다.