Python 字节和字节数组的超类?

Python 字节和字节数组的超类?,python,python-3.x,byte,Python,Python 3.x,Byte,我正在创建一个函数,它将接受Unicode字符串或字节(或bytearray)对象。我想确保只有那些类型的考试通过。我知道我可以通过执行isinstance(x,str)来检查某个东西是否是字符串,并且我知道我可以编写isinstance(x,bytes)或isinstance(x,bytearray) 是否有一种更简洁的方法来检查后者,即是否有一个类同时从字节和字节数组派生而来?除了对象之外,没有公共基类: >>> bytearray.__base__ <class '

我正在创建一个函数,它将接受Unicode字符串或字节(或bytearray)对象。我想确保只有那些类型的考试通过。我知道我可以通过执行
isinstance(x,str)
来检查某个东西是否是字符串,并且我知道我可以编写
isinstance(x,bytes)或isinstance(x,bytearray)


是否有一种更简洁的方法来检查后者,即是否有一个类同时从
字节
字节数组
派生而来?

除了
对象
之外,没有公共基类:

>>> bytearray.__base__
<class 'object'>
>>> bytes.__base__
<class 'object'>
>>bytearray.\uuu基地__
>>>字节__
不要检查类型。让用户传递她想要的任何类型的参数。如果类型没有所需的接口,您的代码仍将失败。

您可以使用:

isinstance(x, (bytes, bytearray))

但是,它可能很有用,因此可以将其他不是从字节或bytearray派生的类型,而是实现正确方法的类型传递给函数。

接受Unicode字符串没有意义,因为它们在任何情况下都不是二进制数据。我可能会接受任何类型的序列,如果该序列中的任何项不是0到255之间的整数(您可能会在压缩过程中发现),则会引发错误


如果要支持Python 2,还需要接受字符串作为特例,因为这是Python 2的二进制类型。

为什么不接受其他支持函数要求的类型?为什么要显式地检查类型?@Jim:嗯,我不知道。我试图实现(作为练习)任何二进制数据的LZW压缩。接受哪些其他类型更有意义?例如NumPy数组。或者是库用户自己编写的C扩展类型。你只是不知道这对什么类型有用。试着使用你得到的东西——如果类型不满足要求,你的代码无论如何都会失败。你需要额外的括号:
isinstance(x,(bytes,bytearray))
。我知道它们不是二进制数据,但我认为接受字符串是有意义的,因为有人可能想要压缩文本。函数检查这种情况,并将字符串解码为UTF-8二进制表示形式。@Javier Badia:如果他们想压缩文本,应该先对其进行编码。例如,将编码为UTF8的中文文本压缩到UTF8中是毫无意义的,因为UTF-16将是一种更有效的编码。用UTF-16编码压缩英文文本也同样愚蠢。我想这是有道理的。谢谢你的帮助。