Если вы посмотрите на документы для bytes
, он указывает на bytearray
:
bytearray ([источник [, кодировка [, ошибки]]])
Вернуть новый массив байтов. Тип bytearray - это изменяемая последовательность целых чисел в диапазоне 0 <= x <256. Он имеет большинство обычных методов изменяемых последовательностей, описанных в Mutable Sequence Types, а также большинство методов, которые имеет тип bytes, см. Байты и Методы массива байтов.
Необязательный параметр source можно использовать для инициализации массива несколькими различными способами:
Если это строка, вы также должны указать параметры кодирования (и, возможно, ошибки); Затем bytearray () преобразует строку в байты с помощью str.encode ().
Если это целое число, массив будет иметь такой размер и будет инициализирован нулевыми байтами.
Если это объект, соответствующий интерфейсу буфера, для инициализации массива байтов будет использоваться доступный только для чтения буфер объекта.
Если это итерация, это должна быть итерация целых чисел в диапазоне 0 <= x <256, которые используются в качестве начального содержимого массива.
Без аргумента создается массив размером 0.
Так bytes
можно сделать гораздо больше, чем просто кодировать строку. Это Pythonic, что позволит вам вызывать конструктор с любым типом исходного параметра, который имеет смысл.
Для кодирования строки, я думаю, что some_string.encode(encoding)
это более Pythonic, чем использование конструктора, потому что это наиболее самодокументируемый - «взять эту строку и кодировать ее с помощью этой кодировки» яснее, чем bytes(some_string, encoding)
- нет явного глагола, когда вы используете конструктор.
Изменить: я проверил источник Python. Если вы передаете строку юникода в bytes
CPython, он вызывает PyUnicode_AsEncodedString , которая является реализацией encode
; так что вы просто пропускаете уровень косвенности, если вы звонитеencode
себя.
Кроме того, см. Комментарий Serdalis - unicode_string.encode(encoding)
также более Pythonic, потому что его инверсия есть byte_string.decode(encoding)
и симметрия хороша.