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:

if type(some_var) is int:
    return True

else:
    return False

Да, это правильно, это подкласс int, вы можете проверить его с помощью интерпретатора:

>>> int.__subclasses__()
[<type 'bool'>]