Подтвердить что ты не робот

Python: почему isststance возвращает False, когда он должен возвращать True?

В настоящее время я нахожусь в pdb-трассе, чтобы понять это.

ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>

Почему это может случиться?

Р. S. isinstance(var, type(var)) возвращает True как ожидалось

4b9b3361

Ответ 1

  • Я могу только догадываться, но если вы делаете в module

    class Type(object): pass
    var = Type()
    class Type(object): pass
    

    то оба типа выглядят как <class 'module.Type'>, но тем не менее разные.

    Вы можете проверить, что с помощью

    print(id(Type), id(var.__class__))
    

    или

    print(Type is var.__class__)
    

    Обратите внимание, что эти сравнения работают как для классов старого, так и для нового стиля. Для классов нового стиля они эквивалентны print(Type is type(var)). Но это не относится к классам старого стиля.

  • Еще одна довольно распространенная проблема заключается в том, что вы вызываете этот модуль с помощью

    python -m module
    

    или

    python module.py
    

    делает его известным как модуль __main__. Если он импортируется где-то еще под его истинным именем, он известен под этим именем также с другим пространством имен.

  • Еще одна догадка может заключаться в том, что вы работаете с ABC или иначе пусть класс имеет метод __instancecheck__().