Тип объединения или Объединение типов

В Python Type[Union[A, B, C]] — это то же самое, что Union[Type[A], Type[B], Type[C]]? Я думаю, что они эквивалентны, и переводчик, похоже, с этим согласен.

Чтобы внести ясность: мне нужен союз типов A, B или C, а не объединение экземпляров A, B или C. Первый вариант короче и, ИМХО, более читабелен.

Другими словами, учитывая эти определения:

class A:
    pass

class B:
    pass

class C:
    pass


def foo(my_class: Type[Union[A, B, C]]):
    pass

Я ожидаю, что это использование будет правильным:

foo(A)   # pass the class A itself

Но не этот:

foo(A()) # pass an instance of A

В этом конкретном контексте я вынужден использовать версию Python, которая не поддерживает новый синтаксис объединения A | B | C.

noamtm 16.07.2024 17:40

Обратите внимание, что ответ «да» на этот вопрос не обобщает: хотя тип является дистрибутивным, а не объединенным, например list[A | B] это не то же самое, что list[A] | list[B]

STerliakov 17.07.2024 01:21

Я знаю, но это хорошее дополнение на случай, если кто-то задаст этот вопрос в поисках чего-то подобного. Спасибо!

noamtm 17.07.2024 08:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Они одинаковые. Вы можете использовать reveal_type и проверить.

class A: ...
class B: ...
class C: ...

def something(a: type[A | B | C]) -> None:
    reveal_type(a)

def something_else(b: type[A] | type[B]| type[C]) -> None:
    reveal_type(b)
mypy main.py
main.py:6: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
main.py:9: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
pyright main.py 
  main.py:6:17 - information: Type of "a" is "type[A] | type[B] | type[C]"
  main.py:9:17 - information: Type of "b" is "type[A] | type[B] | type[C]"

Редактировать:

Старый синтаксис

from typing import Union, Type
class A: ...
class B: ...
class C: ...

def something(a: type[A | B | C]) -> None:
    reveal_type(a)

def something_else(b: type[A] | type[B]| type[C]) -> None:
    reveal_type(b)

def old_something(c: Type[Union[A, B, C]]) -> None:
    reveal_type(c)

def old_something_else(d: Union[Type[A], Type[B], Type[C]]) -> None:
    reveal_type(d)
mypy main.py
main.py:7: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
main.py:10: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
main.py:13: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
main.py:16: note: Revealed type is "Union[type[main.A], type[main.B], type[main.C]]"
pyright main.py
  main.py:7:17 - information: Type of "a" is "type[A] | type[B] | type[C]"
  main.py:10:17 - information: Type of "b" is "type[A] | type[B] | type[C]"
  main.py:13:17 - information: Type of "c" is "type[A] | type[B] | type[C]"
  main.py:16:17 - information: Type of "d" is "type[A] | type[B] | type[C]"

Кроме того, мне интересно, какой из них более читабелен для людей, кроме меня.

noamtm 16.07.2024 17:41

@noamtm Я, вероятно, предпочел бы тот, который я использовал для something, поскольку он короче, но если вы действительно хотите улучшить читабельность, я бы предпочел добавить псевдоним типа.

python_user 16.07.2024 17:45

Для этой задачи я остановился на версии Python, которая не поддерживает новый синтаксис Union, поэтому мой вариант больше похож на ваш old_something.

noamtm 16.07.2024 18:13

Другие вопросы по теме