구체적인 예는 파일 이름과 크기 목록입니다. 목록의 각 항목이 형식이어야하는지 {"filename": "blabla", "size": 123}
아니면 그냥 형식이어야하는지 결정할 수 없습니다 ("blabla", 123)
. 예를 들어 크기에 액세스하는 file["size"]
것이 더 설명이 필요하기 때문에 사전이 나에게 더 논리적 인 것처럼 보이지만 file[1]
실제로는 확실하지 않습니다. 생각?
구체적인 예는 파일 이름과 크기 목록입니다. 목록의 각 항목이 형식이어야하는지 {"filename": "blabla", "size": 123}
아니면 그냥 형식이어야하는지 결정할 수 없습니다 ("blabla", 123)
. 예를 들어 크기에 액세스하는 file["size"]
것이 더 설명이 필요하기 때문에 사전이 나에게 더 논리적 인 것처럼 보이지만 file[1]
실제로는 확실하지 않습니다. 생각?
답변:
나는 namedtuple
:를 사용할 것이다
from collections import namedtuple
Filesize = namedtuple('Filesize', 'filename size')
file = Filesize(filename="blabla", size=123)
이제 가장 쉽게 읽을 수있는 형식 인 IMHO 인 file.size
및 file.filename
프로그램을 사용할 수 있습니다 . 참고 namedtuple
는 튜플과 같은 변경 불가능한 객체를 생성하며 여기에 설명 된대로 사전보다 더 가볍습니다 .
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
모듈을 사용 pip
하거나 (찾아서 검색 할 수 있음) 명명 된 튜플과 매우 유사한 구문 편의를 제공하지만 변경 가능성을 제공 할 수는 있지만 변경할 수는 없습니다. 주요 기능상의 차이점은- attrs
만든 클래스는 평범한 튜플과 동일하지 않습니다 namedtuple
.
namedtuple
본질적으로 불변 특성을 가진 새로운 유형에 대한 짧은 손 선언입니다. 이것은 "어느 A, 대답은 효과적으로 의미 tuple
도 아니고 dict
, 그러나 object
." +1
{ "파일 이름": "blabla", "size": 123} 또는 그냥 ( "blabla", 123)
이것은 형식 / 스키마를 대역 내 또는 대역 외로 인코딩할지 여부에 대한 오래된 질문입니다.
데이터의 형식을 데이터에 표현함으로써 얻을 수있는 가독성과 이식성을 얻기 위해 일부 메모리를 교환합니다. 이 작업을 수행하지 않으면 첫 번째 필드는 파일 이름이고 두 번째 필드는 크기를 다른 곳에 유지해야합니다. 메모리는 절약되지만 가독성과 이식성이 필요합니다. 어느 회사에 더 많은 비용이 듭니까?
불변의 문제에 관해서는, 불변의 의미가 변화에 직면해도 쓸모 없다는 것을 기억하지 마십시오. 메모리를 더 확보하고 사본을 변경하고 새 사본을 사용해야한다는 의미입니다. 그것은 무료가 아니지만 종종 거래 차단기가 아닙니다. 우리는 항상 변경하기 위해 불변 문자열을 사용합니다.
다른 고려 사항은 확장 성입니다. 인코딩 형식 정보없이 데이터를 위치 적으로 만 저장하는 경우 단일 상속만으로 정죄됩니다. 이는 실제로 설정된 필드 뒤에 추가 필드를 연결하는 방법 일뿐입니다. 첫 번째와 두 번째를 같은 방식으로 정의하므로 세 번째 필드를 작성 날짜로 정의하고 형식과 여전히 호환되도록 정의 할 수 있습니다.
그러나 내가 할 수없는 일은 겹치는 필드가있는 두 개의 독립적으로 정의 된 형식을 결합하고 일부는 겹치지 않고 하나의 형식으로 저장하고 하나 또는 다른 형식에 대해서만 알고있는 것에 유용합니다.
그렇게하려면 처음부터 형식 정보를 인코딩해야합니다. "이 필드는 파일 이름입니다"라고 말해야합니다. 그렇게하면 여러 상속이 가능합니다.
상속은 객체의 컨텍스트에서만 표현되는 데 익숙하지만 객체는 데이터 형식으로 저장되므로 동일한 아이디어가 데이터 형식에 적용됩니다. 정확히 같은 문제입니다.
따라서 가장 필요할 것으로 생각되는 것을 사용하십시오. 정당하지 않은 이유를 지적 할 수 없다면 유연성에 도달합니다.
두 가지 속성이있는 클래스를 사용합니다. 또는 file.size
보다 낫습니다 .file[1]
file["size"]
단순한 것보다 복잡한 것이 좋습니다.
file = Filesize(filename='stuff.txt', size=222)
하며 filetup = ("stuff.txt", 222)
둘 다 동일한 JSON을 생성하여 결과는 다음 json.dumps(file)
과 json.dumps(filetup)
같습니다.'["stuff.txt", 222]'
파일 이름이 고유합니까? 그렇다면 목록을 완전히 지우고 모든 파일에 순수한 사전을 사용할 수 있습니다. 예 (가설 웹 사이트)
{
"/index.html" : 5467,
"/about.html" : 3425,
"/css/main.css" : 9876
}
기타...
이제 "이름"과 "크기"를 얻지 못하고 키와 값만 사용하지만 더 자연스러운 경우가 많습니다. YMMV.
당신이 경우 정말 명확성의 "크기"를 원하는, 또는 당신은 다음 파일에 대한 하나 이상의 값이 필요합니다 :
{
"/index.html" : { "size": 5467, "mime_type" : "foo" },
"/about.html" : { "size": 3425, "mime_type" : "foo" }
"/css/main.css" : { "size": 9876, "mime_type" : "bar" }
}
파이썬에서 사전은 변경 가능한 객체입니다. 다른 쪽, 튜플은 불변의 객체입니다.
사전 키, 값 쌍을 자주 또는 매번 변경해야하는 경우 사용할 사전을 제안합니다.
고정 / 정적 데이터가 있다면 튜플을 사용하는 것이 좋습니다.
# dictionary define.
a = {}
a['test'] = 'first value'
# tuple define.
b = ()
b = b+(1,)
# here, we can change dictionary value for key 'test'
a['test'] = 'second'
그러나 할당 연산자를 사용하여 튜플 데이터를 변경할 수 없습니다.
fname, file_size = file
데이터가 위의 튜플이고, 멀리 할 것file[1]
와로 교체file_size
. 물론 이것은 좋은 문서에 의존합니다.