python сравнивает boolean и int с помощью isinstance
может кто-нибудь дать мне объяснение, почему isinstance()
возвращает true в следующем случае? Я ожидал False при написании кода.
print isinstance(True, (float, int))
True
Я предполагаю, что его внутренний подкласс python, как ноль и один - wheter float или int - оба оцениваются при использовании в качестве логического, но не знают точной причины.
что бы быть наиболее подходящие для Python способ решить такую ситуацию? Я мог бы использовать type()
но в большинстве случаев это считается менее подходящие для Python.
3 ответов
по историческим причинам, bool
является наследником int
, Так что True
пример int
. (Первоначально Python не имел типа bool, а вещи, которые возвращали значения истины, возвращали 1 или 0. времени bool
, True и False должны были быть заменами для 1 и 0 как можно больше для обратной совместимости, следовательно, подклассов.)
правильный способ "решить" это зависит от того, что вы считаете проблемой быть.
- если вы хотите
True
перестать бытьint
, ну, очень плохо. Этого не случится. -
если вы хотите обнаружить логические значения и обрабатывать их иначе, чем другие ints, вы можете сделать это:
if isinstance(whatever, bool): # special handling elif isinstance(whatever, (float, int)): # other handling
-
если вы хотите обнаружить объекты, чей конкретный класс точно
float
илиint
, отвергая подклассы, вы можете сделать это:if type(whatever) in (float, int): # Do stuff.
- если вы хотите обнаружить все поплавки и Инты, ты уже это делаешь.
Да, это правильно, это подкласс int, вы можете проверить его с помощью интерпретатора:
>>> int.__subclasses__()
[<type 'bool'>]