Làm cách nào để bạn cộng các byte lại với nhau trong python?

Sự khác biệt giữa

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
2 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
3 là
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
2 trả về một đối tượng không thể sửa đổi và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
3 trả về một đối tượng có thể sửa đổi

PEP này đề xuất thêm các thao tác định dạng % tương tự như loại

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 của Python 2 vào
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8 [1] [2]

cơ sở lý luận

Mặc dù phép nội suy thường được coi là một thao tác chuỗi, nhưng có những trường hợp nội suy trên

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 hoặc
["%x" % val].encode["ascii"]
2 có ý nghĩa và công việc cần thiết để bù cho chức năng bị thiếu này làm giảm khả năng đọc tổng thể của mã

Động lực

Với Python 3 và sự phân chia giữa

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7, một lĩnh vực lập trình nhỏ nhưng quan trọng trở nên khó khăn hơn một chút và đau đớn hơn nhiều – các giao thức định dạng dây [3]

Lĩnh vực lập trình này được đặc trưng bởi sự kết hợp của dữ liệu nhị phân và các đoạn văn bản tương thích ASCII [còn gọi là văn bản được mã hóa ASCII]. Mang lại phép nội suy % bị hạn chế cho

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8 sẽ hỗ trợ cả việc viết mã định dạng dây mới và chuyển mã định dạng dây Python 2

Các trường hợp sử dụng phổ biến bao gồm định dạng tệp

["%x" % val].encode["ascii"]
7 và
["%x" % val].encode["ascii"]
8, định dạng
["%x" % val].encode["ascii"]
9 và liên lạc
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
0 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
1, trong số nhiều trường hợp khác

Đề xuất ngữ nghĩa cho định dạng
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8

%-nội suy

Tất cả các mã định dạng số [

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
4,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
5,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
9,
["%x" % val].encode["ascii"]
20,
["%x" % val].encode["ascii"]
21,
["%x" % val].encode["ascii"]
22,
["%x" % val].encode["ascii"]
23,
["%x" % val].encode["ascii"]
24,
["%x" % val].encode["ascii"]
25 và bất kỳ mã nào sau đó được thêm vào Python 3] sẽ được hỗ trợ và sẽ hoạt động như bình thường . Các mã không phải là số duy nhất được phép là ________ 220, ________ 221, ________ 222 và ________ 223 [đồng nghĩa với b]

Đối với các mã số, sự khác biệt duy nhất giữa phép nội suy

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 [hoặc
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8] là kết quả từ các mã này sẽ là văn bản được mã hóa ASCII, không phải unicode. Nói cách khác, đối với bất kỳ mã định dạng số nào %x

["%x" % val].encode["ascii"]
6

tương đương với

["%x" % val].encode["ascii"]

ví dụ

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'

["%x" % val].encode["ascii"]
27 sẽ chèn một byte đơn, từ một
["%x" % val].encode["ascii"]
28 trong phạm vi [256] hoặc từ một đối số
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 có độ dài 1, không phải từ một
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6

ví dụ

["%x" % val].encode["ascii"]
2

["%x" % val].encode["ascii"]
21 sẽ chèn một loạt byte. Các byte này được thu thập theo một trong hai cách

  • loại đầu vào hỗ trợ
    ["%x" % val].encode["ascii"]
    
    22 [4]?
  • loại đầu vào là cái gì khác?

Đặc biệt,

["%x" % val].encode["ascii"]
21 sẽ không chấp nhận số cũng như
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6.
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 bị từ chối vì quá trình chuyển đổi chuỗi thành byte yêu cầu mã hóa và chúng tôi từ chối đoán;

  • điều gì làm cho một số bị mờ [số float? Số thập phân? Phân số? một số kiểu người dùng?]
  • cho phép các con số sẽ dẫn đến sự mơ hồ giữa các con số và các biểu diễn bằng văn bản của các con số [3. 14 đấu với ‘3. 14’]
  • với bản chất của các định dạng dây, rõ ràng chắc chắn tốt hơn ngầm định

["%x" % val].encode["ascii"]
28 được bao gồm dưới dạng từ đồng nghĩa với
["%x" % val].encode["ascii"]
21 với mục đích duy nhất là làm cho 2/3 cơ sở mã dễ bảo trì hơn. Mã chỉ Python 3 nên sử dụng
["%x" % val].encode["ascii"]
21

ví dụ

["%x" % val].encode["ascii"]
2

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
71 sẽ cho giá trị tương đương với
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
72 trên giá trị nội suy. Các trường hợp sử dụng bao gồm phát triển một giao thức mới và ghi các mốc vào luồng;

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
74 được bao gồm dưới dạng từ đồng nghĩa với
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
71 với mục đích duy nhất là làm cho 2/3 cơ sở mã dễ bảo trì hơn. Python 3 chỉ sử dụng mã
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
71 [7]

ví dụ

["%x" % val].encode["ascii"]
2

Khả năng tương thích với Python 2

Như đã lưu ý ở trên,

["%x" % val].encode["ascii"]
28 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
74 chỉ được đưa vào để giúp dễ dàng di chuyển từ và/hoặc có một cơ sở mã duy nhất với Python 2. Điều này rất quan trọng vì có các mô-đun cả trong tự nhiên và đằng sau cánh cửa đóng kín hiện đang sử dụng loại Python 2
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 làm bộ chứa
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và do đó đang sử dụng
["%x" % val].encode["ascii"]
28 làm bộ nội suy byte

Tuy nhiên,

["%x" % val].encode["ascii"]
21 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
71 nên được sử dụng trong mã mới, chỉ dành cho Python 3, vì vậy,
["%x" % val].encode["ascii"]
28 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
74 sẽ ngay lập tức bị phản đối, nhưng không bị xóa khỏi 3. dòng x [7]

Các biến thể được đề xuất

Nó đã được đề xuất để tự động sử dụng

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
86 cho các đối số của
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 đối với
["%x" % val].encode["ascii"]
21

  • Bị từ chối vì điều này sẽ dẫn đến lỗi liên tục. Tốt hơn là vận hành luôn bị lỗi để có thể khắc phục chính xác điểm sự cố

Nó đã được đề xuất để có

["%x" % val].encode["ascii"]
21 trả về repr được mã hóa ascii khi giá trị là một
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6 [b'%b' % 'abc' -> b“'abc'”]

  • Bị từ chối vì điều này sẽ dẫn đến các lỗi khó gỡ lỗi ở xa trang web có vấn đề. Tốt hơn là vận hành luôn bị lỗi để có thể dễ dàng khắc phục sự cố

Ban đầu, PEP này cũng đề xuất thêm định dạng kiểu định dạng, nhưng người ta quyết định rằng định dạng và bộ máy liên quan của nó đều hoàn toàn dựa trên văn bản [còn gọi là

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
6] và nó đã bị loại bỏ

Nhiều phương pháp đặc biệt mới đã được đề xuất, chẳng hạn như

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
62,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
63, v.v. ;

Một PEP cạnh tranh, PEP 460 Thêm định dạng và nội suy nhị phân, cũng tồn tại

phản đối

Những phản đối đối với PEP này chủ yếu là các biến thể về hai chủ đề

  • các loại
    >>> b'%4x' % 10
    b'   a'
    
    >>> b'%#4x' % 10
    ' 0xa'
    
    >>> b'%04X' % 10
    '000A'
    
    7 và
    >>> b'%4x' % 10
    b'   a'
    
    >>> b'%#4x' % 10
    ' 0xa'
    
    >>> b'%04X' % 10
    '000A'
    
    8 dành cho dữ liệu nhị phân thuần túy, không có giả định về mã hóa
  • cung cấp %-nội suy giả sử mã hóa ASCII sẽ là một mối phiền toái hấp dẫn và đưa chúng ta trở lại các vấn đề của mô hình văn bản Python 2
    >>> b'%4x' % 10
    b'   a'
    
    >>> b'%#4x' % 10
    ' 0xa'
    
    >>> b'%04X' % 10
    '000A'
    
    6/
    >>> b'%4x' % 10
    b'   a'
    
    >>> b'%#4x' % 10
    ' 0xa'
    
    >>> b'%04X' % 10
    '000A'
    
    67

Như đã thấy trong cuộc thảo luận,

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8 cũng được sử dụng cho dữ liệu nhị phân hỗn hợp và các phân đoạn tương thích với ASCII. các định dạng tệp như
["%x" % val].encode["ascii"]
7 và
["%x" % val].encode["ascii"]
8, các giao thức mạng như
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
72 và
["%x" % val].encode["ascii"]
9, v.v.

>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
7 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
8 đã có một số phương thức giả sử mã hóa tương thích ASCII.
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
76,
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
77 và
>>> b'%4x' % 10
b'   a'

>>> b'%#4x' % 10
' 0xa'

>>> b'%04X' % 10
'000A'
78 chỉ kể tên một số. %-interpolation, với ngôn ngữ nhỏ rất hạn chế của nó, sẽ không gây phiền toái hơn các phương thức hiện có

Một số đã phản đối việc cho phép đầy đủ các mã định dạng số với tuyên bố rằng chỉ số thập phân là đủ. Tuy nhiên, ít nhất hai định dạng [dbf và pdf] sử dụng các số không phải là số thập phân

Chủ Đề