Nếu bạn nhìn vào các tài liệu cho bytes
, nó chỉ cho bạn bytearray
:
bytearray ([nguồn [, mã hóa [, lỗi]]])
Trả về một mảng byte mới. Loại bytearray là một chuỗi các số nguyên có thể thay đổi trong phạm vi 0 <= x <256. Nó có hầu hết các phương thức thông thường của các chuỗi có thể thay đổi, được mô tả trong Loại chuỗi có thể thay đổi, cũng như hầu hết các phương thức mà loại byte có, xem Byte và Phương thức mảng Byte.
Tham số nguồn tùy chọn có thể được sử dụng để khởi tạo mảng theo một số cách khác nhau:
Nếu đó là một chuỗi, bạn cũng phải cung cấp các tham số mã hóa (và tùy chọn, lỗi); bytearray () sau đó chuyển đổi chuỗi thành byte bằng str.encode ().
Nếu là số nguyên, mảng sẽ có kích thước đó và sẽ được khởi tạo với byte rỗng.
Nếu nó là một đối tượng phù hợp với giao diện bộ đệm, bộ đệm chỉ đọc của đối tượng sẽ được sử dụng để khởi tạo mảng byte.
Nếu là một lần lặp, nó phải là một số nguyên trong phạm vi 0 <= x <256, được sử dụng làm nội dung ban đầu của mảng.
Không có đối số, một mảng có kích thước 0 được tạo.
Vì vậy, bytes
có thể làm nhiều hơn là chỉ mã hóa một chuỗi. Đó là Pythonic rằng nó sẽ cho phép bạn gọi hàm tạo với bất kỳ loại tham số nguồn nào có ý nghĩa.
Để mã hóa một chuỗi, tôi nghĩ rằng some_string.encode(encoding)
nó nhiều Pythonic hơn là sử dụng hàm tạo, bởi vì nó là tài liệu tự luận nhất - "lấy chuỗi này và mã hóa nó bằng mã hóa này" rõ ràng hơn bytes(some_string, encoding)
- không có động từ rõ ràng khi bạn sử dụng constructor.
Chỉnh sửa: Tôi đã kiểm tra nguồn Python. Nếu bạn chuyển một chuỗi unicode sang bytes
sử dụng CPython, nó sẽ gọi PyUnicode_AsEncodingString , đây là cách thực hiện encode
; Vì vậy, bạn chỉ bỏ qua một mức độ gián tiếp nếu bạn gọi encode
cho mình.
Ngoài ra, xem nhận xét của Serdalis - unicode_string.encode(encoding)
cũng nhiều Pythonic hơn vì byte_string.decode(encoding)
tính đối nghịch của nó là và tính đối xứng là tốt.