簡體   English   中英

對未定義的類使用isinstance

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM