一些Python方法適用於各種輸入源。例如,XML元素樹parse
方法接受一個對象,該對象可以是字符串(在這種情況下API將其視爲文件名),也可以是支持IO接口的對象,如文件對象或io.StringIO
。Python 3:確定對象是否支持IO
因此,顯然parse
方法正在做某種接口嗅探,以確定採取哪種行動。我想最簡單的方法是通過isinstance(x, str)
來檢查輸入參數是否是字符串,如果是這樣,則將其視爲文件名,否則將其視爲IO對象。
但爲了更好的錯誤檢查,我認爲最好檢查x是否支持IO接口。什麼是標準的慣用方法來檢查一個對象是否支持指定的接口?
的一種方式,我想,是隻說:
if "read" in x.__class__.__dict__: # check if object has a read method
但是,僅僅因爲x
有一個「讀」的方法並不一定意味着它支持IO接口,所以我想我還應檢查IO接口中的每種方法。這通常是做這件事的最好方法嗎?或者我應該忘記檢查界面,並讓一個可能的AttributeError
進一步處理堆棧?
我會補充說,檢查接口並不妨礙遵守的類不做它應該做的,使檢查相當多餘。 – XORcist 2011-05-02 14:08:44
io.IOBase是一個抽象的基類,所以你不需要繼承isinstance/issubclass來工作 – 2011-05-02 14:14:09
@gnibbler:你需要從它派生出來,或者你需要使用'IOBase註冊你自己的類型。寄存器()'。儘管如此,我認爲這是一個不必要的併發症,並不能帶來太多好處。 – 2011-05-02 14:17:53