2017-02-03 4 views
5

До того как я повышен до Python 3.6 из питона 3.5 это работало:mypy различия в isinstance и issubclass от питона 3.5 до 3.6 в параметризованных дженериков

import typing 
issubclass(list, typing.List[int]) # returns True 
isinstance([1, 2 ,3], typing.List[int]) # returns True 

теперь питона 3.6 Оба этих поднять следующее исключение:

TypeError: Parameterized generics cannot be used with class or instance checks 

Это новое намеренное поведение или ошибка? Если он предназначен, как я могу выполнить проверки, выполняемые выше кодом в python 3.6?

+0

Я не думаю, что они когда-либо проверяли типы элементов, поэтому '[" a "," b "," c "]' прошло бы 'isinstance ([" a "," b "," c " ], typing.List [int]) '. Внедренная семантика проверки не была полезна. – user2357112

ответ

3

Это намеренно, вы не должны смешивать классы с типами, как определено в typing, по крайней мере, это суть этого из того, что я понял. Большое обсуждение этого вопроса содержится в выпуске #136 Kill __subclasscheck__, который также представил это изменение. commit message также ссылается как isinstance/subclass проверки поднимет TypeError S:

Использование isinstance() или issubclass() поднимает TypeError почти все. Есть исключения: [...]

Вы можно сравнить без указания, содержащихся типов для общих типов, то есть:

isinstance(list, typing.List[int]) 

, но это лучшее, что вы можете сделать AFAIK.

+1

Спасибо, информативная ссылка. Таким образом, нет способа напечатать валидацию, используя типы от ввода? Например, если бы я хотел убедиться, что входные данные для функции согласуются с аннотацией типа функции перед запуском длительной процедуры обработки? Я знаю, что это можно сделать статически с помощью mypy, но я столкнулся с тем, что это можно сделать только динамически в самом коде python. Об этом говорили в пиаре, но я не видел, что он действительно пошел куда угодно. – derchambers

+1

Кстати, 'isinstance (list, typing.List [int])' все еще поднимает TypeError – derchambers

+0

, отредактировал ваш ответ, чтобы код соответствовал тому, что вы описали в тексте. – derchambers

Смежные вопросы