Почему isinstance() так странно работает?
Приведу пример на очень простом коде:
a = 30
b = True
print(type(a), type(b))
print(isinstance(b, type(a)))
print(isinstance(a, type(b)))
И имеем вот такой вот вывод:
<class 'int'> <class 'bool'>
True
False
Собственно, появился вопрос, почему в первом случае isinstance() выдает True?
И что можно сделать, что бы он выдавал False, т.к. IDE не рекомендует использовать данную конструкцию:
if type(a) == type(b):
pass
Версия Python - 3.9.8
Ответы (1 шт):
print(int.__subclasses__())
Вывод:
[<class 'bool'>, <enum 'IntEnum'>, <enum 'IntFlag'>, <class 'sre_constants._NamedIntConstant'>, <class 'pyasn1.type.univ.SizedInteger'>, <class 'grpc._channel._InitialMetadataFlags'>]
Так что isinstance работает согласно своему описанию:
isinstance(object, classinfo) Return True if the object argument is an instance of the classinfo argument, or of a (direct, indirect, or virtual) subclass thereof.
Вообще смысл проверки через isinstance(a, b) в том, можно ли использовать объект a в том месте, где требуется объект класса b. И таки да: bool вполне можно использовать там, где требуется int, на этом построено довольно много разных трюков с кодом, позволяющих писать короткий и понятный код за счёт такого использования. Но наоборот использовать int там где требуется bool - ну, в принципе, можно, но не всегда, и вторая проверка об этом вам и говорит.