我正在做一個函數,它將接受一個Unicode字符串或一個字節(或bytearray)對象。我想確保只有這些類型才能通過。我知道我可以通過執行isinstance(x, str)
來檢查是否有字符串,我知道我可以寫isinstance(x, bytes) or isinstance(x, bytearray)
。字節和字節數組的超類?
是否有一個更簡潔的方式來檢查後者,即是否有一個bytes
和bytearray
派生類?
我正在做一個函數,它將接受一個Unicode字符串或一個字節(或bytearray)對象。我想確保只有這些類型才能通過。我知道我可以通過執行isinstance(x, str)
來檢查是否有字符串,我知道我可以寫isinstance(x, bytes) or isinstance(x, bytearray)
。字節和字節數組的超類?
是否有一個更簡潔的方式來檢查後者,即是否有一個bytes
和bytearray
派生類?
有除了object
沒有公共基類:
>>> bytearray.__base__
<class 'object'>
>>> bytes.__base__
<class 'object'>
不檢查的類型。讓用戶傳遞她想要的任何類型的參數。如果該類型沒有所需的接口,那麼代碼無論如何都會失敗。
這是[Duck Typing](https://en.wikipedia.org/wiki/Duck_typing)原理。 – 2013-05-22 09:20:29
您可以使用:
isinstance(x, (bytes, bytearray))
然而,duck typing可能是有用的,所以其他類型不是從字節或ByteArray派生,但實施正確的方法可以傳遞給函數。
您需要額外的括號:'isinstance(x,(bytes,bytearray))'。 – 2011-06-07 23:58:16
你是對的。 – Robin 2011-06-08 05:01:02
接受Unicode字符串沒有意義,因爲它們在任何情況下都不是二進制數據。我可能會接受任何類型的序列,並且如果序列中的任何項目不是0到255之間的整數(在壓縮過程中您可能會發現),則會引發錯誤。
如果你想支持Python 2中,還需要接受字符串作爲一個特殊的情況,因爲這是二進制類型的Python 2.
爲什麼不接受其他類型的支持您的功能要求,以及?爲什麼明確檢查類型? – 2011-06-07 21:59:29
@Jim:呃,我不知道。我試圖爲任何二進制數據實現(作爲練習)LZW壓縮。還有什麼其他類型可以接受? – Javier 2011-06-07 22:01:56
例如NumPy數組。或者你的圖書館的用戶只是自己寫的C擴展類型。你只是不知道這可能對什麼類型有用。嘗試使用你所得到的 - 如果類型不符合要求,代碼將會失敗。 – 2011-06-07 22:06:35