2010-11-17 18 views
5

[Python 3.1]Python: jak utworzyć skrót zagnieżdżonych kontenerów

Próbuję utworzyć skrót do pojemnika, który może być zagnieżdżony w niej pojemniki z nieznanej głębi. Na wszystkich poziomach hierarchii istnieją tylko wbudowane typy. Jaki jest dobry sposób na zrobienie tego?

Dlaczego muszę go:

jestem buforowanie wynik pewnych obliczeń w obiekcie marynowane (na dysku). Będę musiał unieważnić ten buforowany plik, jeśli funkcja zostanie wywołana z innymi parametrami (dzieje się to rzadko, więc nie zamierzam zapisywać więcej niż jednego pliku na dysk). Hash będzie użyty do porównania parametrów.

+0

Czy spodziewasz się, że wartości te będą mogły się zmienić po ich utworzeniu? – aaronasterling

+0

@araronsterling: Czy możesz wyjaśnić? Nie jestem pewien, czy odpowiadam na twoje pytanie, ale kontenery i ich zawartość nie zostaną zmodyfikowane. Jednak muszę podkreślić, że uporczywość jest oczywiście wymagana do jakiegokolwiek przyszłego wywołania tego programu w Pythonie (w nowym procesie). – max

+0

Więc jesteś w porządku z małą szansą, że plik nie zostanie unieważniony przez różne parametry funkcji? Każda funkcja hash będzie miała szansę na kolizję, więc szukasz takiej z minimalną szansą na kolizję. Po prostu staram się lepiej zrozumieć problem. –

Odpowiedz

1

Można po prostu serializować parametry w coś takiego jak JSON i użyć tego dla skrótu.

+0

Podoba mi się ten pomysł. Czy są jakieś ukryte problemy? Na przykład, czy złamie niektóre skomplikowane struktury gniazdujące, itp.? – max

+0

Nie, o ile tylko są to krotki, listy, dykta, strs i int, wszystko w porządku. Jedno zastrzeżenie jednak: 'tuple' ==' list' (ponieważ JavaScript nie ma pojęcia 'krotki') –

+2

Myślę, że użyłbym' pickle.dumps' zamiast 'json.dumps'; pikle jest precyzyjne z typami i ~ 15% szybsze (wyregulowałem je). –

1

Jeśli wszystkie pojemniki są krotkami, a wszystkie zawarte w nich obiekty są nieszczelne, to główny pojemnik powinien być zgodny z horyzontalnymi danymi.

+0

Dobra uwaga. Niestety wśród kontenerów są słowniki. – max

+1

Możesz skonwertować słowniki na posortowaną krotkę krotek (klucz, wartość). – Paul

0

Zrobiłbym to z serializacją json jako ciąg [a następnie hash ten ciąg, jeśli jest to nadal konieczne].

from simplejson import dumps 

def hash_data(data): 
    return hash(dumps(data)) 
Powiązane problemy