У меня есть приложение, которое имеет библиотеку в нескольких конфигурациях:Как обобщить вызов функции, который может быть асинхронным, торнадо coroutine или нормальным?
- python2.7 родной
- python2.7 Торнадо
- Python3.5 asyncio
В настоящее время у меня есть код, почти идентичен всем трем, но есть незначительные различия в том, как вызывается каждый вызов функции. Это означает, что у меня есть тонны дублирования кода, потому что у меня есть такие вещи, как следующее во многих местах:
#Python2.7native.py
def main(client):
client.foo(args)
client.bar(args)
#Python2.7tornado.py
@gen.coroutine
def main(client):
yield client.foo(args)
yield client.bar(args)
#Python3.5asyncio.py
async def main(client):
await client.foo(args)
await client.bar(args)
где client
является языком конкретной реализации в, поддерживая родную питона, asyncio и торнадо соответственно. Вызов метода API идентичен.
Я надеюсь, чтобы иметь возможность как-то обобщить это в один метод, который я могу включить в общий файл, который соответствующим образом вызывает различные методы
Я думал об определении методов в отдельном файле и с помощью getattr
, чтобы вызвать тест правильно, но это кажется действительно грязным.
Есть ли хороший способ сделать это?
Если на самом деле они идентичны в разных разделах, за исключением того, d, можете ли вы создать список функций, а затем перечислить конкретный бегун для платформы через этот список и вызвать его соответствующим образом? –
Проблема будет '' async def''. Насколько мне известно, нет 2,7 эквивалента. Если вам нужно разделить между несколькими версиями Python, то я бы выбрал '' gen.coroutine'' для этих функций. –