Size: a a a

2020 January 27

БС

Байт Словович in rannts
Хм, столкнулся с проблемой.

Есть код, который в нормальном случае должен работать асинхронно. (В моем случае это обновление нескольких полей, которые берутся из thirdparty внешней системы, и таймауты там огромные могут быть, но эти поля не влияют на основной функционал, поэтому я могу позволить их обновить позже. ) Пишу вот так:
asyncio.ensure_future(xxx())

Но вот в этой xxx могут быть ошибки, и мне желательно в unittestах их все поймать, то есть чтобы тест сразу упал  надо делать синхронный вызов. Получается код аля:
coro = xxx()
if test:
   await coro
else:
  asyncio.ensure_fututre(coro)


А это как то не красиво. Понятно что можно написать обертку аля:
def ensure_future(coro):
   if test:
       await coro
   else:
      asyncio.ensure_future(coro_

ensure_future(xxx())

Это красивее, но получается что в юниттестах тестируется только один бранч в этой функции. То есть асинхронный вызов не тестируется.
Кто нить с подобным сталкивался и красиво решал?
источник

💭П

💭 Руслан Прохоров in rannts
Друзья....

А где докопаться до истины в разнице между созданием листа через list() и []?

a = ['testlist=*.xml', 'config=*.py']

a_v1 = [a]
a_v2 = list(a)

print(a_v1)
print(a_v2)

Выхлоп:
[['testlist=*.xml', 'config=*.py']]
['testlist=*.xml', 'config=*.py']


Я просто реально потерялся и не пойму, почему list() не создает мне лист, а выплевывает имеющийся.
источник

БС

Байт Словович in rannts
[a]

означает создать список, где первый элемент равен a

list(a)

Означает создать список из последовательности a.

Ибо можно сделать так:
list(dict.keys())
источник

БС

Байт Словович in rannts
Ну и list(xxx) это не копирующий конструктор.  Помоему в питоне такого термина даже нет. Хотя int(19) как раз он и есть
источник

💭П

💭 Руслан Прохоров in rannts
Байт Словович
[a]

означает создать список, где первый элемент равен a

list(a)

Означает создать список из последовательности a.

Ибо можно сделать так:
list(dict.keys())
и так как а - это список, то я и получаю список, которой и передал.
источник

БС

Байт Словович in rannts
Ты получаешь новый список, в котором тоже самое содержимое
источник

БС

Байт Словович in rannts
Вот ты сейчас зациклен на том что a это список. Вот сделай тоже самое, только пусть a будет туплом или словарем
источник

RB

Roman Bolkhovitin in rannts
Еще можно id посмотреть
источник

A🍊

Andrey 🍊 in rannts
a = [1, 2, 3]
a != [a]
источник

RH

Roman Haritonov in rannts
Байт Словович
Хм, столкнулся с проблемой.

Есть код, который в нормальном случае должен работать асинхронно. (В моем случае это обновление нескольких полей, которые берутся из thirdparty внешней системы, и таймауты там огромные могут быть, но эти поля не влияют на основной функционал, поэтому я могу позволить их обновить позже. ) Пишу вот так:
asyncio.ensure_future(xxx())

Но вот в этой xxx могут быть ошибки, и мне желательно в unittestах их все поймать, то есть чтобы тест сразу упал  надо делать синхронный вызов. Получается код аля:
coro = xxx()
if test:
   await coro
else:
  asyncio.ensure_fututre(coro)


А это как то не красиво. Понятно что можно написать обертку аля:
def ensure_future(coro):
   if test:
       await coro
   else:
      asyncio.ensure_future(coro_

ensure_future(xxx())

Это красивее, но получается что в юниттестах тестируется только один бранч в этой функции. То есть асинхронный вызов не тестируется.
Кто нить с подобным сталкивался и красиво решал?
Можно замокать ensure_feature чтобы она кроме основного действий давала возможность что угодно делать с фючей. Ещё есть вариант с добавлением хука/обертки прям в код, которая например для тестов собирает все фючи
источник

RH

Roman Haritonov in rannts
В моке аргумент wraps
источник

БС

Байт Словович in rannts
Замокоть основную ensure_future, это совсем не вариант. Она  же может быть во многих местах, плюс библиотеки. Тут слишком злые сайдэффекты будут.
источник

AM

Artem Malyshev in rannts
DI, DI, DI, DI, DI, DI...
источник

RH

Roman Haritonov in rannts
Ну в Di покрыта будет тоже только тестовая имплементация
источник

AM

Artem Malyshev in rannts
Мож тогда интеграционные тесты? Чтоб наверняка всё сработало.
источник

RH

Roman Haritonov in rannts
Байт Словович
Замокоть основную ensure_future, это совсем не вариант. Она  же может быть во многих местах, плюс библиотеки. Тут слишком злые сайдэффекты будут.
Я не предлагаю их сразу ожидать. А вроде из фьючи можно выдрать, что она зовёт. Только нужные авейтить сразу. У тебя вряд-ли их много.
источник

БС

Байт Словович in rannts
Artem Malyshev
DI, DI, DI, DI, DI, DI...
угу, код ради тестов.. Спасибо, я на это насмотрел в джаве, там без DI ваще низя. Хорошо что в питоне есть моки, и во многих случаях можно обойтись без этого DI
источник

БС

Байт Словович in rannts
Roman Haritonov
Я не предлагаю их сразу ожидать. А вроде из фьючи можно выдрать, что она зовёт. Только нужные авейтить сразу. У тебя вряд-ли их много.
Разумно звучит, но сложно...
источник

RH

Roman Haritonov in rannts
Но в любом случае, в нетестах ведь тоже кто-то дожидается всех вызовов. Поэтому тесты будут исключать конкурентность и по другому себя вести. Можно ещё как-то на эвенты завязаться или всё-таки в основном коде помнить эти фьчи, а в тестах ждать
источник

БС

Байт Словович in rannts
В моем случае как раз никто не дожидается. Если из 3rdparty пришла инфа, то обновляется в базе и на этом всё. Тут даже эксепшен автоматом никто не поймает и в сентри не пошлет.
Но хотя да, можно в какой нить списочек такую футурку и добавить. И в каком нить стопе  дождаться что она закончилась.
источник