Как объединить два типа при типизации Python? [дубликат]Python

Программы на Python
Ответить
Anonymous
 Как объединить два типа при типизации Python? [дубликат]

Сообщение Anonymous »

При типизации Python вы можете использовать A | B (или, что эквивалентно, Union[A, B]), чтобы указать, что тип — либо A или B >.
Однако есть ли способ указать что-то вроде A & B в TypeScript или A + B в Rust, чтобы указать, что тип оба A и B?
(Я нашел Комбинацию типов с типизацией Python, но ответ был для этого конкретного использования итерации и длины, а не в качестве общего ответа на заголовок вопроса.)
Кроме того, если есть поддержка в Python, поддерживается ли она Pydantic, как я' Я пишу с его помощью классы данных?

Сценарий использования
В моем случае я хотел бы улучшить некоторые Pydantic модель данных с дополнительными полями (например, добавьте идентификатор к этим объектам в соответствии с пользовательским правилом; идентификатор никогда не известен до создания всех объектов). Если я просто хочу добиться цели, я считаю, что могу создать родительский класс и множественно наследовать от него каждый тип, который мне нужен. Но это очень утомительно и приведет к созданию множества классов, которые эффективно используются только один раз. Комбинация типов сделает эту задачу значительно проще и универсальнее.
Рассмотрим следующий фрагмент примера:

Код: Выделить всё

T = TypeVar('T')

class ItemA(BaseModel):
pass

class ItemB(BaseModel):
pass

class Container(BaseModel,Generic[T]):
contents: list[T]

ItemAContainer = Container[ItemA]
ItemBContainer = Container[ItemB]

obj1 = ItemAContainer([ItemA()])
Теперь я хочу представить новый тип контейнера (эффективно использующий новые типы элементов), в котором содержащимися элементами являются элементы с дополнительным полем id . Я надеюсь получить что-то вроде следующего (при условии, что такой синтаксис A + B существует):

Код: Выделить всё

def gen_id(*arg):
# Generate ID based on whatever arguments passed in
pass

class WithID(BaseModel):
id: str

WithIDContainer[T] = Container[T + WithID]

obj2 = WithIDContainer[ItemA](contents=[{'id': gen_id(e, obj1), **e} for e in obj1.contents])
Это избавляет меня от необходимости переопределять другой набор ItemAWithID и ItemBWithID и дает понять, что WithIDContainer имеет отношение к типу Container , но с дополнительными требованиями.

Подробнее здесь: https://stackoverflow.com/questions/790 ... hon-typing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»