2012-05-14 3 views
12

Я в настоящее время в PDB следа, чтобы понять этоPython: почему caninstance возвращает False, когда он должен возвращать True?

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

Почему это может произойти?

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

+5

Может существовать несколько типов, называемых «Тип» (например, в разные моменты времени). Не могли бы вы привести полный пример, демонстрирующий проблему? – NPE

+10

есть ли в вашем коде волшебство 'import' /' reload'? –

+0

@RomanBodnarchuk, я так не думаю. Можете ли вы привести примеры такой магии? – Shark

ответ

13
  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)). Но это не относится к классам старого стиля.

  2. Другой весьма распространенной ловушкой является то, что вы называете этот модуль

    python -m module 
    

    или

    python module.py 
    

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

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

+0

Я определил только один тип для всех моих исходных файлов. И я не занимаюсь скрытыми методами. Только '__str__',' __iter__', '__len__'. Так что это не так. Кроме того, этот класс является подклассом 'object'. – Shark

+0

BTW, я сейчас в сессии pdb. Что я должен проверить, чтобы определить причину? – Shark

+0

Вы можете рассмотреть возможность поиска 'id (type (var))', 'type (var) is Type' и т. Д. –

Смежные вопросы