2017-02-03 33 views
5

Zanim przeniesieni do Python 3.6 z Pythona 3.5 to działało:mypy różnice w isinstance i issubclass z pytona 3,5 do 3,6 w parametrycznych generycznych

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

teraz w Pythonie 3.6 Oba te podnieść następujący wyjątek:

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

Czy to nowe zamierzone zachowanie lub błąd? Jeśli jest to zamierzone, w jaki sposób mogę wykonać sprawdzenia powyższy kod robi w python 3.6?

+0

Nie sądzę, że kiedykolwiek sprawdzali typy elementów, więc '[" a "," b "," c "] minąłoby' isinstance (["a", "b", "c" ], typing.List [int]) ". Wprowadzona semantyka sprawdzenia nie była przydatna. – user2357112

Odpowiedz

3

Jest to celowe, nie powinieneś mieszać klas z typami określonymi w typing, przynajmniej, to jest sedno tego z tego, co zrozumiałem. Wiele dyskusji na ten temat zawiera kwestia #136 Kill __subclasscheck__, która również wprowadziła tę zmianę. commit message odwołuje się również, w jaki sposób isinstance/subclass sprawdza podniesie TypeError s:

Korzystanie isinstance() lub issubclass() podnosi TypeError prawie wszystko. Istnieją wyjątki: [...]

Ty może porównać bez określania typów zawartych w ogólnych typów, tj:

isinstance(list, typing.List[int]) 

ale to najlepsze, co możesz zrobić AFAIK.

+1

Dzięki, informacyjny link. Więc nie ma sposobu na sprawdzenie poprawności typów za pomocą pisania? Na przykład, jeśli chciałem upewnić się, że dane wejściowe do funkcji są spójne z adnotacjami typu funkcji przed uruchomieniem długiej procedury przetwarzania? Wiem, że można to zrobić statycznie za pomocą mypy, ale pracuję nad przypadkiem, który może być wykonywany dynamicznie tylko w kodzie Pythona. Było trochę o tym w PR, ale nie zauważyłem, że faktycznie nadeszło. – derchambers

+1

nawiasem mówiąc, 'isinstance (list, typing.List [int])' nadal podnosi TypeError – derchambers

+0

edytował twoją odpowiedź, więc kod jest zgodny z tym, co opisałeś w tekście. – derchambers