Python中异步函数的命名约定是什么?
在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(...)
1 个回答
在Python中,所有的类名应该使用PascalCase
这种命名方式。这一点在PEP 8 - Python风格指南中有详细说明。除此之外,我不知道有什么特别的asyncio
命名规则。
对于与异步相关的类,命名方式可以由你和你的代码库来决定。在一个完全使用asyncio
的代码库中,我觉得在类名中加上Async
这个词并没有什么特别的好处。不过,如果你的代码库中同时有asyncio
的代码和同步代码,那么在类名前加上Async
就会有好处。例如,假设你有一个同步线程在和一个asyncio
事件循环进行通信。在事件循环内部,你可能会创建一个Inbox
类,用来在各种协程和任务之间进行通信。为了让人清楚这个类是用在事件循环中的,给它命名为AsyncInbox
而不是单纯的Inbox
就很有意义。
至于方法的命名,这同样由你来决定。如果你查看asyncio.Queue
这个核心模块,你会发现里面有同步方法(比如get_nowait
和put_nowait
)和异步方法(比如get
和put
)混合在一起。大多数情况下,你的IDE中的代码检查工具,比如Pylance,会清楚地告诉你一个方法或函数是否返回协程。此外,协程是必须使用async
关键字的。所以一般来说,与我对类的命名建议不同,我觉得在函数或方法中加上async
这个词并没有太大意义。
不过,当一个类(以及它的方法)或一个模块(以及它的函数)同时提供同步和异步两个版本的函数时,给它们命名就有意义了。在这种特殊情况下,可以考虑在后面加上_async
作为后缀。但这还是要看情况。例如,上面提到的asyncio.Queue
类并没有这样做,因为get_nowait
和put_nowait
实际上是非阻塞函数。如果它们是阻塞的,那么可以考虑将它们命名为get_sync
和put_sync
,或者保持它们的名字为get
和put
,并将异步阻塞版本命名为get_async
和put_async
,这些都是可行的选择。