Используйте атрибут из необязательного параметра [Union [str, int]] в зависимости от его типа - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть параметр типа: a: Optional[Union[str, int]].

Я хочу использовать некоторые атрибуты, когда это строка, и другие, когда это целое число.Например:

    if type(a) is int:
        self.a = a
    elif type(a) is str and a.endswith('some preffix'):
        self.b = a

Однако MyPy жалуется на следующее:

ошибка: элемент "int" из "Union [str, int, None]" не имеет атрибута "конец с"

error: у элемента" None "из" Union [str, int, None] "нет атрибута" конец с "

Есть ли способ заставить эту работу работать с MyPy?

1 Ответ

1 голос
/ 25 сентября 2019

Идиома, которую вы должны использовать: isinstance(a, int) вместо type(a) is int.Если вы сделаете первое и напишите:

if isinstance(a, int):
    self.a = a
elif isinstance(a, str) and a.endswith('some_prefix'):
    self.b = a

... тогда ваш код должен быть проверен на чистоту.

Причина, по которой выполнение type(a) is int не поддерживается / скорее всего выигранов ближайшее время мы не получим поддержки, потому что то, что вы в основном утверждаете, это то, что «a» - это точно int и никакого другого типа.

Но у нас на самом деле нетчистый способ написания такого типа в PEP 484 - если вы говорите, что некоторая переменная 'foo' имеет тип 'Bar', вы действительно говорите, что 'foo' может иметь тип 'Bar' или любой подкласс 'Bar'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...