在Python课程中,当你必须混合使用同步和异步函数时,最佳实践是什么?
第一个选项:
Class My_Class:
def myfct_sync(...)
async def myfct_async(...)
第二个选项:带有“a”字符的前缀,例如
__iter__
和 __aiter__
Class My_Class:
def myfct(...)
async def amyfct(...)
第三种选择:分两班
Class My_Class:
def myfct(...)
Class Async_My_Class:
async def myfct(...)
Python 中的所有类都应该是
PascalCase
。 PEP 8 - Python 风格指南中有详细介绍。除此之外,我不知道任何具体的 asyncio
命名约定。
对于异步相关的类,这取决于您和您的代码库。在纯粹的
asyncio
代码库中,我认为将单词 Async
放在类名称中的某个位置不会有任何额外的好处。然而,在 asyncio
代码将与同步代码混合的代码库中,我认为使用 Async
作为类前缀确实有好处。例如,假设您有一个同步线程与 asyncio
事件循环进行通信。在事件循环内部,您可以创建一个 Inbox
类来在事件循环上运行的各种协程和任务之间进行通信。将类命名为 AsyncInbox
而不仅仅是 Inbox
是有意义的,以明确它旨在在事件循环内使用。
asyncio.Queue
的核心模块,就会发现混合了同步(get_nowait
、put_nowait
)和异步方法(get
、put
)。在大多数情况下,IDE 的 linter(例如 Pylance)应该足够清楚地表明方法或函数是否返回协程。此外,协程需要才能使用 async
关键字。所以一般来说,与我对类的建议相反,我认为将单词
async
添加到函数或方法中没有多大意义。对我来说确实有意义的是当一个类(以及方法)或模块(以及函数)公开一个函数的两个版本时,一个是同步的,一个是异步的。在这种特殊情况下,可以考虑将
_async
作为后缀。但这仍然要看情况。例如,上面的
asyncio.Queue
类不会这样做,因为
get_nowait
和
put_nowait
实际上是非阻塞函数。如果是,那么将它们命名为
get_sync
和
put_sync
或者将它们保留为
get
和
put
并将异步阻塞版本命名为
get_async
和
put_async
将是一些选择。