Однако есть ли способ указать что-то вроде 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()])
Код: Выделить всё
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])
Подробнее здесь: https://stackoverflow.com/questions/790 ... hon-typing
Мобильная версия