Суперкласс байтов и байтов? - PullRequest
7 голосов
/ 08 июня 2011

Я делаю функцию, которая будет принимать либо строку Unicode, либо объект bytes (или bytearray). Я хочу убедиться, что только эти типы будут переданы. Я знаю, что могу проверить, является ли что-то строка, выполнив isinstance(x, str), и я знаю, что могу написать isinstance(x, bytes) or isinstance(x, bytearray).

Есть ли более краткий способ проверить последнее, т. Е. Есть ли класс, из которого происходят bytes и bytearray?

Ответы [ 3 ]

7 голосов
/ 08 июня 2011

Единого базового класса не существует, кроме object:

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

Не проверяйте тип. Пусть пользователь передает параметры любого типа, который он желает Если тип не имеет требуемого интерфейса, ваш код все равно не будет работать.

3 голосов
/ 08 июня 2011

Вы можете использовать:

isinstance(x, (bytes, bytearray))

Тем не менее, duck typing может быть полезным, поэтому другие типы, не производные от байтов или байтов, но реализующие правильные методы, могут быть переданы в функцию.

2 голосов
/ 08 июня 2011

Нет смысла принимать строки в Юникоде, так как они ни в коем случае не являются двоичными данными.Я бы, вероятно, согласился бы с любой последовательностью и вывел бы ошибку, если какой-либо элемент в этой последовательности не является целым числом от 0 до 255. (которое вы, вероятно, обнаружите во время сжатия).

Если вы хотите поддержатьВ Python 2 вам также нужно принимать строки как особый случай, так как это двоичный тип для Python 2.

...