我目前在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
預期
我目前在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
預期
我只能猜測,但如果你在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))
。 但老式課程並非如此。
另一種相當常見的陷阱是,你把這個模塊
python -m module
或
python module.py
使得它被稱爲__main__
模塊。如果它以其真實名稱導入其他地方,則以該名稱以及以不同的名稱空間而知。
另一種猜測可能是您正在與ABCs一起工作,或者讓該班級有一個__instancecheck__()
方法。
可能有多種類型被稱爲「類型」(說在不同的時間點)。你能否提供一個證明問題的完整例子? – NPE
你的代碼中有沒有'import' /'reload'魔法? –
@RomanBodnarchuk,我不這麼認爲。你能提供這樣的魔法的例子嗎? – Shark