Правильное использование Union [] в Python3 - PullRequest
0 голосов
/ 25 сентября 2018

Я немного озадачен использованием Union в статической типизации Python.

class A():
    foo: int = 10

class B():
    bar: str = 'hello'

def get_object() -> Union[A, B]:
    return B()

var = get_object()
var.bar

Приведенный выше фрагмент кода возвращает error: Item "A" of "Union[A, B]" has no attribute "bar"

Состояние документов

Взаимодействие между пересечением и объединением является сложным, но это не должно вызывать удивления, если вы понимаете взаимодействие между пересечениями и объединениями регулярных множеств

, что приводит меня к мысли, что переменнаятипа Union[A, B] может использоваться, как если бы он был типа A или B, без ошибок проверки типа .Это неверно?

Если да, то как мне добиться функциональности, которая бы имитировала это?( то есть значение из get_object можно использовать, как если бы оно было типа A или B)

Спасибо за вашу помощь, дайте мне знать, если вам нужны какие-либо разъяснения.

1 Ответ

0 голосов
/ 25 сентября 2018

Да Union[A,B] означает, что значение может быть либо типа A или типа B ..

Это не не подразумевает, что вы можете обращаться со значением, как если бы оно было A или B по вашему выбору.Именно в этом и заключается использование типа пересечения.

Если у вас есть Union[A,B], вам нужно проверить, является ли значение A, и, если это так, обрабатывать его как A или B и обращаться с ним как с B.Преимущество состоит в том, что вы знаете, что это не будет другой тип C, поэтому у вас есть определенный список типов для проверки.Но вам все равно нужно проверить каким-то образом.

...