2016-12-12 2 views
0

객체를 반복하는 동안 빌드되는 사전이 있습니다. 이제 동일한 객체를 여러 번 액세스 할 수 있습니다. 그리고 객체 자체를 키로 사용하고 있습니다.파이썬 (Python) - 동일한 객체를 랩핑하여 고유하게 만듭니다.

그래서 동일한 객체에 두 번 이상 액세스하면 키가 고유하지 않게되고 사전이 더 이상 올바르지 않게됩니다.

개체별로 액세스해야하지만 이후에 누군가가 콘텐츠에 액세스하려고하므로 나중에 현재 개체로 액세스하도록 요청할 수 있습니다. 그리고 그것은 그때 마지막 활성 객체에 접근하기 때문에 정확할 것입니다.

그래서 개체를 어떻게 든 감쌀 수 있는지 궁금해서 상태와 모든 특성을 동일하게 유지할 수 있지만 유일한 차이점은이 새로운 종류의 개체가 실제로 고유하다는 것입니다. 예를 들어

:

dct = {} 

for obj in some_objects_lst: 
    # Well this kind of wraps it, but it loses state, so if I would 
    # instantiate I would lose all information that was in that obj. 
    wrapped = type('Wrapped', (type(obj),), {}) 
    dct[wrapped] = # add some content 

지금 이것보다 더 좋은 대안이 있다면, 나도 그것을 듣고 싶습니다.

P. 반복되는 객체는 다른 컨텍스트에 있으므로 객체가 같더라도 다르게 처리됩니다. 문제가 어디에서 오는지

업데이트 요청으로

이 더 나은 예를 제공 :

나는이 엑셀 발전기 모듈을보고 있습니다. 이를 사용하여 다양한 Excel 보고서를 생성 할 수 있습니다. 이를 위해 Python 사전을 사용하여 구성을 작성해야합니다.

이제 보고서가 생성되기 전에 두 가지 작업을 수행해야합니다. 메타 데이터 (여기서 메타 데이터는 보고서가 작성 될 때 각 셀의 위치입니다.)와 두 번째로 구성을 분석하여 셀에 내용을 채 웁니다.

이 모듈에서 사용할 수있는 값 유형 중 하나는 공식 (Excel 수식)입니다. 그리고 내 질문에 문제가 수식을 계산할 수있는 방법 중 하나를 구체적으로 있습니다 : 수식 값은 부모, 그 하위에있는 검색됩니다.

이는 예를 들어 엑셀 파일 구조 상상 : 셀 (1A)의이 예시적인 합 지금

A   | B   | C 
    Total  Childs Name Amount 
1 sum(childs) 
2    child_1  10 
3    child_2  20 

4 sum(childs) 
    ... 

을 합이에서 (그들의 차일 열 합계 식을 사용하는 경우 10 + 20 = 30 될 필요 케이스 C 칼럼). 그리고이 모든 것은 동일한 객체 (iterables라고 부름)가 반복 될 때까지 작동합니다. 메타 데이터를 만들 때 저장해야하므로 나중에 검색해야합니다. 그리고 열쇠는 반복되는 객체입니다. 이제 값을 파싱 할 때 다시 반복 될 때 일부 정보가 동일한 객체로 덮어 쓰기 때문에 모든 정보가 표시되지 않습니다.

예를 들어 인보이스 오브젝트가 있다고 가정하면 인보이스와 관련된 파트너 오브젝트가 있으며 지정된 인보이스 및 파트너가 특정 금액을 생성하는 다른 임의의 오브젝트가 있습니다. Excel에서 이러한 정보를 추출 할 때

은 그래서, 이렇게되면 예에서

inoice1 -> partner1 -> amount_obj1, amount_obj2 
invoice2 -> partner1 -> amount_obj3, amount_obj4. 

공지 사항이 파트너가 동일합니다.값을 구문 분석 할 때 내가 설명하는 경우 메타 데이터가 실제로

PS는 몰라amount_obj3amount_obj4 값을 개최한다 때, 나는 두 번이 개체를 반복하기 때문에 내가 열쇠로이를 저장할 수 없기 때문에 여기에서 문제는, 더 많은 코드가 있기 때문에 코드의 거대한 벽을 여기에 넣고 싶지는 않습니다.

갱신 2

내가 너무 특정되는 것 때문에 단지 더 많은 사람들을 혼란, 더 추상적 각도에서이 문제를 설명하려고합니다.

주어진 개체 목록과 빈 사전, 사전은 개체를 반복하여 작성됩니다. 개체는 사전에서 키 역할을합니다. 나중에 사용되는 메타 데이터가 포함되어 있습니다.

같은 목록을 다른 목적으로 다시 반복 할 수 있습니다. 완료되면 iterated 오브젝트 (해당 사전의 키와 동일한 오브젝트)를 사용하여 사전 값에 액세스해야합니다. 그러나 문제는 동일한 객체가 두 번 이상 사용 된 경우 해당 키에 대해 최근 저장된 값만 포함된다는 것입니다.

여기서 개체는 고유 한 키가 아닙니다. 하지만 문제는 내가 (값을 검색해야 할 때) 객체 만 아는 유일한 것입니다. 그러나 동일한 반복이기 때문에 동일한 객체를 두 번 액세스 할 때 반복의 특정 인덱스는 동일합니다.

그럼 고유성은 내가 생각하기에 (index, object)입니다.

+0

두 번째 단락과 모순되는 점 (* 키가 고유하지 않고 내 사전이 더 이상 정확하지 않음 *)과 세 번째 단락 (*이 시점에서 마지막 활성 개체에 액세스 *) : 왜 값을 바꿉니 까? 마지막으로 활성 객체에 액세스하는 것이 다른 경우 다른 문제가 있습니까? dict의 기본 동작이 문제가되는 것 같습니다. – mguijarr

+0

글쎄, 이건 너무 생각했지만 작동하지 않습니다. 하지만 어쩌면 당신이 맞고 실제로 코드에 버그가있어서 기대 한 것보다 다른 결과를 얻을 수 있습니다. (나는 다른 부분에서 내용을 얻을 것으로 기대합니다. 다른 키를 의미합니다) – Andrius

+0

어쩌면 더 많은 컨텍스트 정보를 제공 할 수 있습니다. 더 명확하게하기 위해하고있는 일은 무엇입니까? – mguijarr

답변

0

문제를 이해할 수 있을지 잘 모르겠습니다. 두 가지 옵션이 있습니다. 중요한 객체 컨텐츠라면 객체 사본을 키로 유지하십시오. 개체가이 코드와 다음에 의해 확인 이번이 처음 사이에 변경되지 않으면 뭔가 원유

new_obj = copy.deepcopy(obj) 
dct[new_obj] = whatever_you_need_to_store(new_obj) 

처럼 동작은 영향을 미치지 않고 두 번째로 수행됩니다. 최적은 아니지만 큰 문제는 아닙니다. 그래도 바뀌면 이전 레코드와 새로운 레코드에 대해 별도의 레코드를 얻게됩니다. 메모리를 절약하기 위해 복사본을 객체 데이터 등을 쓰는 해시 __str__() 메서드로 대체하려고합니다. 그러나 그것은 당신의 대상이 무엇인지에 달려 있습니다. 어쩌면 해싱은 메모리 절약에 너무 많은 시간이 걸릴 것입니다. 몇 가지 테스트를 실행하고 효과가 있는지 확인하십시오.

반면에 동일한 객체에 대해 동일한 값을 유지하는 것이 중요하다면 (예 : 객체는 로그인과 로그 오프 사이에서 데이터를 변경할 수있는 사용자 세션 임) , 객체 ID를 사용하십시오. id() 내장 함수가 아닙니다. 개체가 GCed되거나 삭제되면 다른 개체가 해당 ID를 얻을 수 있기 때문입니다. 개체에 id 특성을 정의하고 다른 개체가 동일한 개체를 얻을 수 없다는 것을 확인하십시오.

관련 문제