2016-07-11 17 views
5

Sau khi đóng gói một số nguyên trong một cấu trúc Python, việc giải nén kết quả trong một bộ dữ liệu ngay cả khi nó chỉ chứa một mục. Tại sao việc giải nén trả lại một bộ dữ liệu?Tại sao việc giải nén một kết quả struct trong một tuple?

>>> x = struct.pack(">i",1) 

>>> str(x) 
'\x00\x00\x00\x01' 

>>> y = struct.unpack(">i",x) 

>>> y 
(1,) 
+2

Nếu cấu trúc chứa nhiều hơn một mục thì bạn sẽ quay trở lại cái gì? Nói chung, tốt nhất là nếu các hàm chỉ trả về một kiểu duy nhất (vì vậy người gọi không phải có trường hợp đặc biệt tùy thuộc vào việc có một hoặc hai mục hay ...) – mgilson

+0

Tôi hiểu ... Đây có phải là/chỉ/đúng cách để đóng gói/giải nén một * int *? – Jedi

+1

Trong các phiên bản python gần đây có 'int.from_bytes' và' int.to_bytes' – mgilson

Trả lời

5

Xin xem doc đầu tiên struct doc

struct.pack (fmt, v1, v2, ...)

Return một chuỗi chứa giá trị v1, v2, ... đóng gói theo định dạng đã cho. Đối số phải khớp chính xác với các giá trị theo yêu cầu của định dạng.

-

struct.unpack (fmt, string)

Unpack chuỗi (có lẽ đóng gói bởi gói (fmt, ...)) theo định dạng nhất định. Kết quả là một tuple ngay cả khi nó chứa chính xác một mục. Chuỗi phải chứa chính xác lượng dữ liệu được yêu cầu theo định dạng (len (chuỗi) phải bằng calcsize (fmt)).

struct.pack được định nghĩa là struct.pack(fmt, v1, v2, ...). Nó chấp nhận một danh sách đối số không được lập từ khóa (v1, v2, ..., aka *args), vì vậy struct.unpack cần trả về một danh sách như đối tượng, đó là lý do tại sao tuple.

Nó sẽ là dễ hiểu nếu bạn xem xét gói như

x = struct.pack(fmt, *args) 
args = struct.unpack(fmt, x) # return *args 

Ví dụ:

>>> x = struct.pack(">i", 1) 
>>> struct.unpack(">i", x) 
(1,) 
>>> x = struct.pack(">iii", 1, 2, 3) 
>>> struct.unpack(">iii", x) 
(1, 2, 3) 
+0

Cảm ơn bạn đã đề cập đến điều đó. Tôi nên đề cập đến trong câu hỏi của tôi rằng tôi đã thấy điều này trong tài liệu. Tôi không chắc chắn *** tại sao *** nó trả về một tuple mặc dù ... – Jedi

+1

@ Jedi Tôi đã cập nhật câu trả lời để giải thích chi tiết – Mithril

1

nghĩ đến một trường hợp sử dụng mà tải dữ liệu nhị phân được viết bằng ngôn ngữ C. Python sẽ không thể phân biệt được nếu dữ liệu nhị phân được viết bằng cách sử dụng một cấu trúc hoặc sử dụng một số nguyên duy nhất. Vì vậy, tôi nghĩ, về mặt logic nó có ý nghĩa để trả về tuple luôn, vì struct pack và unpack thực hiện các chuyển đổi giữa các giá trị Python và các cấu trúc C.

Các vấn đề liên quan