[英]Use isinstance with an undefined class
假定有時(但並非總是)定義了MyClass
類。 我有一個函數foo(a=None)
,其中參數a
可以是None
,字符串或MyClass
的對象。
我的問題是:如果在我的Python會話中未定義MyClass
,如何以類似於isinstance
的方式檢查參數a
的類型,而不會出現NameError
?
關於鴨子類型的注意事項:我故意限制該功能。
我正在使用Python 2.6.x,並且不能選擇更新。 前向兼容的解決方案(尤其是2.7.x版)受到高度贊賞。
如果未定義MyClass
則無法引用其類型。
因此,您將無法驗證type(a)
具有正確的值。
我會建議使用另一種方法:填充類,以便所有想要引用它的代碼都可以這樣做:
try:
from foo import Bar # load the native class
except ImportError:
class Bar:
pass # implement necessary parts here
您可以將其放入自己的模塊中,然后from mymodule import Bar
到需要的地方。 這樣一來,所有代碼都可以使用Bar
而無論它是否是本地定義的。
即使重新定義類不是處理此問題的首選方法,但處理ImportError
仍然是處理這種情況的方法,因為您將不得不以任何一種方式import
該類,而這正是發生錯誤的地方。 除了定義類之外,您可能還想設置class_exists = False
標志或其他東西。
我通過重寫 MyClass
的方法而不執行任何操作( pass
)來解決該問題。 之后,我不再需要檢查其類型。
對於不同的情況,可能存在不同的解決方法。 捕獲NameError可能是另一個。
t = 'asdfas'
print(isinstance(t, str))
try:
print(isinstance(t, MyClass))
except NameError:
print(False)
在我看來,這樣的構造可能會出現在未來的python中。 就像輸入python一樣,這是很新的。 在鍵入的python中,我們有可能在apos中使用將來的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.