Вернуть пустое
Nov. 9th, 2022 03:51 pmВот я прям питон начинаю не любить. Казалось бы, утиная типизация и всеобщая приятность. Никакого фашизма, всё можно.
А вот вам простая задачка, которую на rust'е generic'и решают в одну строчку, а на питоне я не знаю как (в разумные усилия).
Есть функция, которая читает вывод (утилиты) и возвращает распашенный json. Она достаточно generic, чтобы в зависимости от вывода утилиты вернуть list или dict.
Теперь я хочу добавить фэнсервиса - если вывод пустой, то возвращать пустой элемент (список или словарь). Как? КАК?
>>> class foo(dict,list):
... pass
...
Traceback (most recent call last):
File "", line 1, in
TypeError: multiple bases have instance lay-out conflict
А вот вам простая задачка, которую на rust'е generic'и решают в одну строчку, а на питоне я не знаю как (в разумные усилия).
Есть функция, которая читает вывод (утилиты) и возвращает распашенный json. Она достаточно generic, чтобы в зависимости от вывода утилиты вернуть list или dict.
Теперь я хочу добавить фэнсервиса - если вывод пустой, то возвращать пустой элемент (список или словарь). Как? КАК?
>>> class foo(dict,list):
... pass
...
Traceback (most recent call last):
File "
TypeError: multiple bases have instance lay-out conflict
no subject
Date: 2022-11-09 06:34 pm (UTC)Это же type hinting, ты не можешь его возвращать как "значение" (в контексте влияния на тип возвращаемого значения).
То есть если foo: Union[list,dict], то как мне сделать дефолтный элемент, который подходит обоим?
foo.count(3) foo.values()
no subject
Date: 2022-11-09 07:05 pm (UTC)В смысле, принадлежит пересечению множеств значений
list’а иdict’а? Так оно пусто.Ну то есть можно, наверно, реализовать класс
Empty, в нём реализовать все методыlist’а и возвращать из них всё то же самое, что на их месте возвращал бы[], и все методыdict’а и из них возвращать как если бы мы были{}. Много бойлерплейта. И надо решить конфликты для тех методов, которые есть и уlist’а, и уdict’а, и ведут себя по-разному. Например,__str__и__repr__, скорее всего, у такогоEmptyбудут свои собственные.Или можно со своим клиентом договориться, что мы таки возвращаем даже не
Union[list, dict, Empty], аUnion[list, dict, None](akaOptional[Union[list, dict]]). И там уже его ответственность проверять и обрабатывать этот кейс.no subject
Date: 2022-11-09 07:11 pm (UTC)Нет, не так.
Смотри. Есть функция json_loads. Sound она по типам или unsound - это вопрос открытый, вне обсуждения.
Теперь мне нужно для этой функции написать декоратор, который бы сохранял оригинальную семантику:
но возвращал Default для соотв. типа, если (внешний side effect) вернул ошибку.
И вот я не могу. Я не знаю, что ожидает вызывающий код, так что я не могу вернуть соответствующий тип.
А срачик на reddit'е (к сожалению, потёрли) сказал, что сконструировать list-or-dict невозможно в принципе, потому что https://docs.python.org/3/c-api/typeobj.html#Py_TPFLAGS_MAPPING
no subject
Date: 2022-11-10 05:47 am (UTC)Гм. То есть с вон тем предложенным
Emptyбудут проблемы, когда пациент попробует его паттерн-матчить об паттерны[…]или{…}. Окей, верю.