반응형
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 속성에 값이 잘 부여된 것을 확인할 수 있습니다.
'Python > Utils' 카테고리의 다른 글
파이썬 구글 이메일(Gmail) 보내기 SMTP 예제(파일 및 이미지 첨부 포함) (3) | 2024.03.06 |
---|---|
파이썬으로 동영상에 음악 넣기 방법(moviepy 활용) (0) | 2024.01.22 |
파이썬으로 비디오(mp4 등) -> 오디오(mp3, wav 등) 추출하기(moviepy 활용) (0) | 2024.01.20 |