Почему 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 шт):

Автор решения: CrazyElf
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 - ну, в принципе, можно, но не всегда, и вторая проверка об этом вам и говорит.

→ Ссылка