I'm curious about the best strategies for handling asynchronous initialization in Python. Say we have a class called `Klass` that requires a resource, which can be obtained via the asynchronous coroutine `get_resource()`. I've thought of a few approaches: 1) Using an alternative classmethod to initialize the class after getting the resource, 2) Following a builder or factory pattern to separate async logic from the class structure, 3) Implementing an async context manager but finding that using `async with` every time can be cumbersome, and 4) Starting the async logic in the `__init__` method, which seems to allow for concurrent runs but adds complexity. What are your thoughts on these options? Do you have any preferred methods or alternative strategies to recommend?
1 Answer
I recently read an article that suggests avoiding `__init__` methods altogether, advocating instead for using factory functions. This can simplify async initialization by not overloading the constructor with additional responsibilities. I agree that using async tasks inside `__init__` can lead to unbound tasks and make error handling tricky—errors may not propagate as expected, leading to issues down the line. It's generally better to keep it clean and separate the concerns.
That article was interesting! Thanks for sharing it.