Python中异步函数的命名约定是什么?

1 投票
1 回答
41 浏览
提问于 2025-04-12 18:29

在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 个回答

0

在Python中,所有的类名应该使用PascalCase这种命名方式。这一点在PEP 8 - Python风格指南中有详细说明。除此之外,我不知道有什么特别的asyncio命名规则。

对于与异步相关的类,命名方式可以由你和你的代码库来决定。在一个完全使用asyncio的代码库中,我觉得在类名中加上Async这个词并没有什么特别的好处。不过,如果你的代码库中同时有asyncio的代码和同步代码,那么在类名前加上Async就会有好处。例如,假设你有一个同步线程在和一个asyncio事件循环进行通信。在事件循环内部,你可能会创建一个Inbox类,用来在各种协程和任务之间进行通信。为了让人清楚这个类是用在事件循环中的,给它命名为AsyncInbox而不是单纯的Inbox就很有意义。

至于方法的命名,这同样由你来决定。如果你查看asyncio.Queue这个核心模块,你会发现里面有同步方法(比如get_nowaitput_nowait)和异步方法(比如getput)混合在一起。大多数情况下,你的IDE中的代码检查工具,比如Pylance,会清楚地告诉你一个方法或函数是否返回协程。此外,协程是必须使用async关键字的。所以一般来说,与我对类的命名建议不同,我觉得在函数或方法中加上async这个词并没有太大意义。

不过,当一个类(以及它的方法)或一个模块(以及它的函数)同时提供同步和异步两个版本的函数时,给它们命名就有意义了。在这种特殊情况下,可以考虑在后面加上_async作为后缀。但这还是要看情况。例如,上面提到的asyncio.Queue类并没有这样做,因为get_nowaitput_nowait实际上是非阻塞函数。如果它们是阻塞的,那么可以考虑将它们命名为get_syncput_sync,或者保持它们的名字为getput,并将异步阻塞版本命名为get_asyncput_async,这些都是可行的选择。

撰写回答