2016-07-11 3 views
5

파이썬 구조체에 정수를 패킹 한 후에 언 패킹은 하나의 항목 만 포함하는 경우에도 튜플을 생성합니다. 언 패킹이 튜플을 반환하는 이유는 무엇입니까?struct를 언 패킹하면 터플이 생성되는 이유는 무엇입니까?

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

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

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

>>> y 
(1,) 
+2

구조체에 둘 이상의 항목이 들어 있으면 반환하는 항목은 무엇입니까? 일반적으로 함수가 하나의 유형 만 반환하는 것이 가장 좋습니다 (호출자가 하나의 항목이 있는지 또는 두 가지가 있는지 또는 ... 여부에 따라 특별한 경우가 필요하지 않음) – mgilson

+0

알겠습니다 ...이 유일한/올바른/Pythonic입니까? * int *를 팩/언팩하는 방법? – Jedi

+1

최근의 파이썬 버전에는'int.from_bytes'와'int.to_bytes'가 있습니다. – mgilson

답변

5

문서 제 struct doc

다음 struct.pack (FMT, V1, V2, ...) 값을 포함

복귀 문자열을보십시오 V1, V2, ... 지정된 형식에 따라 압축됩니다. 인수는 이 형식에서 요구하는 값과 정확하게 일치해야합니다.

-

struct.unpack (FMT, 문자열)

문자열을 풀고 (아마도 팩 포장 (FMT, ...))이 소정 포맷에 따라. 정확히 하나의 항목이 포함 된 경우에도 결과는 튜플 입니다. 문자열은 정확히 형식에 필요한 데이터의 양을 포함해야합니다. len (string)은 calcsize (fmt)와 같아야합니다.

struct.packstruct.pack(fmt, v1, v2, ...)으로 정의되기 때문에. 키워드가 아닌 인수 목록 (v1, v2, ..., 별명 *args), 을 허용하므로 struct.unpack은 객체와 같은 목록을 반환해야하므로 튜플이 그 이유입니다.

그것은 당신이

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

예로 팩을 고려하면 이해하기 쉬울 것이다 : C 언어를 사용하여 작성된 바이너리 데이터를로드하는 유스 케이스

>>> 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

그것을 언급해 주셔서 감사합니다. 내 질문에 나는 문서에서 이것을 보았어야했다. 나는 *** *** 왜 그것이 튜플을 반환하는지 모르겠다. – Jedi

+1

@Jedi 나는 세부 사항을 설명하는 대답을 업데이트했다. – Mithril

1

생각합니다. 파이썬은 구조체를 사용하거나 단일 정수를 사용하여 이진 데이터를 작성한 경우 구별 할 수 없습니다. struct pack과 unpack은 파이썬 값과 C 구조체 사이의 변환을 수행하므로 논리적으로 항상 튜플을 반환하는 것이 좋습니다.

관련 문제