通常要编写python 2/3兼容代码,您要遵循两种解释器都可以理解的某种样式,例如:https://python-future.org/compatible_idioms.html。
但是,由于asyncio引入了async def
和await function()
之类的语法,因此如果在Python 2下运行,则会导致解析错误。
如何编写兼容python 2和python 3且仍可以提供asyncio接口的库?如果没有简便的方法,是否可以在库中制作一个只能在python 3.5+中导入的异步子模块?
答案 0 :(得分:1)
在Python 2中无法支持异步样式的协程,因为Python 2没有以下功能:
async def
和await
; yield from
; 有一个项目使用不带yield from
的普通生成器来创建asyncio的Python 2版本,但这是abandoned年前。
答案 1 :(得分:0)
虽然在Python 2中支持async def
函数是不可行的,但可能创建一个包含async def
函数的模块,这些模块仅在Python 3.5或更高版本中导入。但! 可能有更好的解决方法,例如将异步代码放入不同的模块,程序包或完全独立的库中。
下面的示例完全属于“ 是的,但是为什么会这样? ”类别。朴素的测试表明它可以在CPython 2.6.9上运行3.7.3,异步代码仅在3.5或更高版本上加载。
from __future__ import print_function
import sys
ASYNC_SOURCE = """
import asyncio
async def three():
print('three')
"""
if sys.version_info[0] > 2 and sys.version_info[1] > 4:
exec(compile(ASYNC_SOURCE, __file__, "exec"))
def two():
print("two")
if __name__ == "__main__":
two()
if "three" in locals():
asyncio.run(three())