Напишите асинхронную сопрограмму, совместимую с Python 2 и 3 - PullRequest
0 голосов
/ 03 января 2019

Обычно для написания кода, совместимого с python 2/3, вы следуете определенному стилю, понятному обоим интерпретаторам, например: https://python -future.org / compatibility_idioms.html .

Однако, поскольку asyncio вводит синтаксис, такой как async def и await function(), это приведет к ошибке синтаксического анализа при запуске под Python 2.

Как написать библиотеку, совместимую с Python 2 и Python 3что еще может обеспечить интерфейс asyncio?Если нет простого способа сделать это, возможно ли сделать в библиотеке определенный асинхронный подмодуль, который можно импортировать только в python 3.5 +?

Ответы [ 2 ]

0 голосов
/ 14 июля 2019

Хотя невозможно поддерживать async def функции в Python 2, возможно создать модуль, который включает 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())
0 голосов
/ 03 января 2019

Поддержка сопрограмм в асинхронном стиле в Python 2 невозможна, поскольку в Python 2 нет ни одного из:

  • async def и await;
  • Их предшественник yield from;
  • Сама библиотека asyncio в любой форме.

Был проект по созданию версии Python 2 asyncio с использованием обычных генераторов без yield from, но он был заброшен лет назад.

...