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

问题描述 投票:0回答:1

在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 python-asyncio naming-conventions
1个回答
0
投票

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
 将是一些选择。

© www.soinside.com 2019 - 2024. All rights reserved.