2012-05-14 138 views
12

我目前在PDB跟蹤算出這個Python:爲什麼isinstance返回False,何時應該返回True?

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

爲什麼能這樣呢?

P. S. 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__) 
    

    注意,這些比較兩個OLD-工作,以及新式的類。 對於新式課程,它們相當於print(Type is type(var))。 但老式課程並非如此。

  2. 另一種相當常見的陷阱是,你把這個模塊

    python -m module 
    

    python module.py 
    

    使得它被稱爲__main__模塊。如果它以其真實名稱導入其他地方,則以該名稱以及以不同的名稱空間而知。

  3. 另一種猜測可能是您正在與ABCs一起工作,或者讓該班級有一個__instancecheck__()方法。

+0

我只在所有源文件中定義了一個Type。 而我並沒有擺弄隱藏的方法。只有'__str__','__iter__','__len__'。所以情況並非如此。另外,這個類是'object'的子類。 – Shark

+0

順便說一句,我目前在pdb會話。我應該檢查什麼來確定原因? – Shark

+0

您可能會考慮查看'id(type(var))','type(var)is Type'等。 –

相關問題