2011-06-07 135 views
6

我正在做一個函數,它將接受一個Unicode字符串或一個字節(或bytearray)對象。我想確保只有這些類型才能通過。我知道我可以通過執行isinstance(x, str)來檢查是否有字符串,我知道我可以寫isinstance(x, bytes) or isinstance(x, bytearray)字節和字節數組的超類?

是否有一個更簡潔的方式來檢查後者,即是否有一個bytesbytearray派生類?

+1

爲什麼不接受其他類型的支持您的功能要求,以及?爲什麼明確檢查類型? – 2011-06-07 21:59:29

+0

@Jim:呃,我不知道。我試圖爲任何二進制數據實現(作爲練習)LZW壓縮。還有什麼其他類型可以接受? – Javier 2011-06-07 22:01:56

+3

例如NumPy數組。或者你的圖書館的用戶只是自己寫的C擴展類型。你只是不知道這可能對什麼類型有用。嘗試使用你所得到的 - 如果類型不符合要求,代碼將會失敗。 – 2011-06-07 22:06:35

回答

6

有除了object沒有公共基類:

>>> bytearray.__base__ 
<class 'object'> 
>>> bytes.__base__ 
<class 'object'> 

不檢查的類型。讓用戶傳遞她想要的任何類型的參數。如果該類型沒有所需的接口,那麼代碼無論如何都會失敗。

+1

這是[Duck Typing](https://en.wikipedia.org/wiki/Duck_typing)原理。 – 2013-05-22 09:20:29

2

您可以使用:

isinstance(x, (bytes, bytearray)) 

然而,duck typing可能是有用的,所以其他類型不是從字節或ByteArray派生,但實施正確的方法可以傳遞給函數。

+0

您需要額外的括號:'isinstance(x,(bytes,bytearray))'。 – 2011-06-07 23:58:16

+0

你是對的。 – Robin 2011-06-08 05:01:02

2

接受Unicode字符串沒有意義,因爲它們在任何情況下都不是二進制數據。我可能會接受任何類型的序列,並且如果序列中的任何項目不是0到255之間的整數(在壓縮過程中您可能會發現),則會引發錯誤。

如果你想支持Python 2中,還需要接受字符串作爲一個特殊的情況,因爲這是二進制類型的Python 2.

+0

我知道他們不是二進制數據,但我認爲接受字符串是有意義的,因爲有人可能想壓縮文本。該函數檢查這種情況並將該字符串解碼爲其UTF-8二進制表示形式。 – Javier 2011-06-08 09:46:18

+1

@Javier Badia:如果他們想壓縮文本,他們應該先對它進行編碼。例如,壓縮編碼爲UTF8的中文文本是非常沒有意義的,因爲UTF-16將是一種更高效的編碼。而用UTF-16編碼壓縮英文文本也同樣愚蠢。 – 2011-06-08 11:47:41

+0

我想這是有道理的。謝謝您的幫助。 – Javier 2011-06-08 17:09:11