Konkretnym przykładem jest lista nazw plików i ich rozmiarów. Nie mogę zdecydować, czy każdy element na liście powinien mieć formę {"filename": "blabla", "size": 123}
, czy tylko ("blabla", 123)
. Słownik wydaje mi się bardziej logiczny, ponieważ na przykład dostęp do rozmiaru file["size"]
jest bardziej objaśniający niż file[1]
... ale tak naprawdę nie jestem pewien. Myśli?
python
dictionary
clb
źródło
źródło
fname, file_size = file
gdzie dane są twoim krotkiem, zlikwiduj jefile[1]
i zastąp jefile_size
. Oczywiście zależy to od dobrej dokumentacji.Odpowiedzi:
Użyłbym
namedtuple
:Teraz można korzystać
file.size
orazfile.filename
w programie, który jest IMHO najbardziej czytelna forma. Uwaganamedtuple
tworzy niezmienne obiekty, takie jak krotki, i są one bardziej lekkie niż słowniki, jak opisano tutaj .źródło
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
modułu (można go znaleźćpip
lub po prostu go wyszukać), który pozwala na uzyskanie bardzo podobnych udogodnień syntaktycznych do nazwanej krotki, ale może dać ci zmienność (ale może być również niezmienny). Główną różnicą funkcjonalną jest to, żeattrs
klasy stworzone nie są równe krotkom zwykłym, jaknamedtuple
to robią.class
,def
i=
wszystkie po prostu nadpisują wszelkie poprzednie zastosowania. repl.itnamedtuple
jest to zasadniczo deklaracja krótkiej ręki dla nowego typu z niezmiennymi atrybutami. Oznacza to, że odpowiedź brzmi: „Ani atuple
ani adict
, aleobject
”. +1Jest to odwieczne pytanie, czy kodować format / schemat wewnątrz pasma, czy poza pasmem.
Wymieniasz trochę pamięci, aby uzyskać czytelność i przenośność, która wynika z wyrażenia formatu danych bezpośrednio w danych. Jeśli tego nie zrobisz, wiedza, że pierwsze pole to nazwa pliku, a drugie to rozmiar, musi zostać zachowane w innym miejscu. Oszczędza to pamięć, ale kosztuje czytelność i przenośność. Co będzie kosztować Twoją firmę więcej pieniędzy?
Jeśli chodzi o kwestię niezmienną, pamiętaj, że niezmienna nie oznacza bezużyteczności w obliczu zmiany. Oznacza to, że musimy pobrać więcej pamięci, wprowadzić zmiany w kopii i użyć nowej kopii. To nie jest darmowe, ale często nie stanowi przełomu. Używamy niezmiennych ciągów do zmiany rzeczy przez cały czas.
Innym aspektem jest rozszerzalność. Gdy przechowujesz dane tylko na miejscu, bez kodowania informacji o formacie, jesteś skazany tylko na pojedyncze dziedziczenie, co tak naprawdę jest niczym innym jak praktyką łączenia dodatkowych pól po ustalonych polach. Mogę zdefiniować trzecie pole jako datę utworzenia i nadal być zgodne z twoim formatem, ponieważ definiuję pierwszy i drugi w ten sam sposób.
Jednak nie mogę połączyć dwóch niezależnie zdefiniowanych formatów, które mają niektóre nakładające się pola, niektóre nie, przechowują je w jednym formacie i mogą być przydatne do rzeczy, które wiedzą tylko o jednym lub drugim formacie.
Aby to zrobić, muszę od początku zakodować informacje o formacie. Muszę powiedzieć „to pole to nazwa pliku”. Pozwala to na wielokrotne dziedziczenie.
Prawdopodobnie przywykłeś do dziedziczenia wyrażanego tylko w kontekście obiektów, ale te same pomysły działają dla formatów danych, ponieważ obiekty są przechowywane w formatach danych. To dokładnie ten sam problem.
Użyj więc tego, co uważasz za najbardziej potrzebne. Sięgam po elastyczność, chyba że mogę wskazać dobry powód, aby tego nie robić.
źródło
Użyłbym klasy o dwóch właściwościach.
file.size
jest ładniejszy niż jedenfile[1]
lubfile["size"]
.Prosty jest lepszy niż złożony.
źródło
file = Filesize(filename='stuff.txt', size=222)
ifiletup = ("stuff.txt", 222)
oba generują ten sam JSON:json.dumps(file)
ijson.dumps(filetup)
powodują:'["stuff.txt", 222]'
Czy nazwy plików są unikalne? Jeśli tak, możesz całkowicie zeskrobać listę i po prostu użyć czystego słownika dla wszystkich plików. np. (hipotetyczna strona internetowa)
itp...
Teraz nie dostajesz „nazwy” i „rozmiaru”, po prostu używasz klucza i wartości, ale często jest to bardziej naturalne. YMMV.
Jeśli naprawdę potrzebujesz „rozmiaru” dla zachowania przejrzystości lub potrzebujesz więcej niż jednej wartości dla pliku, to:
źródło
W Pythonie słownik jest obiektem zmiennym. Z drugiej strony krotka jest niezmiennym przedmiotem.
jeśli chcesz zmienić klucz słownika, często paruj wartości lub za każdym razem. sugeruję użycie słownika.
jeśli masz stałe / statyczne dane, sugeruję użycie krotki.
Ale nie można zmienić danych krotkowych za pomocą operatora przypisania.
źródło