Jeśli spojrzysz na dokumenty bytes
, wskazuje to na bytearray
:
bytearray ([source [, kodowanie [, błędy]]])
Zwraca nową tablicę bajtów. Typ bytearray to zmienna sekwencja liczb całkowitych z zakresu 0 <= x <256. Posiada większość zwykłych metod sekwencji zmiennych, opisanych w Zmiennych typach sekwencji, a także większość metod typu bajtów, patrz Bajty i Metody tablicy bajtów.
Opcjonalnego parametru źródłowego można użyć do zainicjowania tablicy na kilka różnych sposobów:
Jeśli jest to ciąg, musisz również podać parametry kodowania (i opcjonalnie błędy); bytearray () następnie konwertuje ciąg na bajty za pomocą str.encode ().
Jeśli jest liczbą całkowitą, tablica będzie miała ten rozmiar i zostanie zainicjowana bajtami zerowymi.
Jeśli jest to obiekt zgodny z interfejsem bufora, do zainicjowania tablicy bajtów zostanie użyty bufor tylko do odczytu obiektu.
Jeśli jest iterowalna, musi być iterowalna z liczb całkowitych z zakresu 0 <= x <256, które są używane jako początkowa zawartość tablicy.
Bez argumentu tworzona jest tablica o rozmiarze 0.
bytes
Może więc zrobić znacznie więcej niż tylko kodowanie łańcucha. Pythonic pozwala na wywołanie konstruktora z dowolnym typem parametru źródłowego, który ma sens.
Myślę, że w przypadku kodowania ciągu some_string.encode(encoding)
jest to bardziej Pythonic niż używanie konstruktora, ponieważ jest to najbardziej samok dokumentujące - „weź ten ciąg i zakoduj go za pomocą tego kodowania” jest wyraźniejsze niż bytes(some_string, encoding)
- nie ma wyraźnego czasownika podczas używania konstruktor.
Edycja: sprawdziłem źródło Python. Jeśli przekażesz ciąg Unicode, aby bytes
użyć CPython, wywołuje PyUnicode_AsEncodedString , który jest implementacją encode
; więc po prostu omijasz poziom pośredni, jeśli nazywasz encode
siebie.
Zobacz także komentarz Serdalisa - unicode_string.encode(encoding)
jest również bardziej Pythoniczny, ponieważ jego odwrotność jest byte_string.decode(encoding)
i symetria jest ładna.