amarao: (Default)
[personal profile] amarao
Вот я прям питон начинаю не любить. Казалось бы, утиная типизация и всеобщая приятность. Никакого фашизма, всё можно.

А вот вам простая задачка, которую на 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

Date: 2022-11-09 06:05 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
from typing import Union

foo = Union[list, dict]

Date: 2022-11-09 06:19 pm (UTC)
From: [personal profile] permeakra
А ты не должен этого хотеть. Пустая строка - не валидный json, поэтому пустая строка - это не json, а какое-то bottom. Как именно это моделировать - вопрос отдельный

Date: 2022-11-09 07:05 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

В смысле, принадлежит пересечению множеств значений list’а и dict’а? Так оно пусто.

Ну то есть можно, наверно, реализовать класс Empty, в нём реализовать все методы list’а и возвращать из них всё то же самое, что на их месте возвращал бы [], и все методы dict’а и из них возвращать как если бы мы были {}. Много бойлерплейта. И надо решить конфликты для тех методов, которые есть и у list’а, и у dict’а, и ведут себя по-разному. Например, __str__ и __repr__, скорее всего, у такого Empty будут свои собственные.

Или можно со своим клиентом договориться, что мы таки возвращаем даже не Union[list, dict, Empty], а Union[list, dict, None] (aka Optional[Union[list, dict]]). И там уже его ответственность проверять и обрабатывать этот кейс.

Date: 2022-11-09 08:53 pm (UTC)
From: [personal profile] permeakra
т.е. у тебя там третье значение. Ну так и возвращай его.

Date: 2022-11-10 05:47 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Гм. То есть с вон тем предложенным Empty будут проблемы, когда пациент попробует его паттерн-матчить об паттерны […] или {…}. Окей, верю.

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 02:40 pm
Powered by Dreamwidth Studios