Contoh spesifik dalam pikiran adalah daftar nama file dan ukurannya. Saya tidak dapat memutuskan apakah setiap item dalam daftar harus dalam bentuk {"filename": "blabla", "size": 123}
, atau adil ("blabla", 123)
. Kamus tampaknya lebih logis bagi saya karena untuk mengakses ukuran, misalnya, file["size"]
lebih jelas daripada file[1]
... tapi saya tidak benar-benar tahu pasti. Pikiran?
python
dictionary
clb
sumber
sumber
fname, file_size = file
, di mana data tuple di atas Anda, akan menghapusfile[1]
dan menggantinya denganfile_size
. Tentu saja ini bergantung pada dokumentasi yang baik.Jawaban:
Saya akan menggunakan
namedtuple
:Sekarang Anda dapat menggunakan
file.size
danfile.filename
dalam program Anda, yang merupakan bentuk IMHO paling mudah dibaca. Notenamedtuple
menciptakan objek yang tidak dapat diubah seperti tuple, dan mereka lebih ringan daripada kamus, seperti dijelaskan di sini .sumber
Filesize = namedtuple('Filesize', 'filepath kilobytes')
attrs
modul yang sangat bagus (dapat menemukannya melaluipip
atau hanya mencarinya), yang memungkinkan Anda memiliki kemudahan sintaksis yang sangat mirip dengan nama tuple, tetapi dapat memberi Anda mutabilitas (tetapi juga dapat dibuat tidak berubah). Perbedaan fungsional utama adalah bahwaattrs
kelas buatan tidak sebanding dengan tupel biasa, sepertinamedtuple
yang dilakukan s.class
,,def
dan=
semua hanya menimpa penggunaan sebelumnya. repl.itnamedtuple
pada dasarnya adalah deklarasi tangan pendek untuk tipe baru dengan atribut yang tidak dapat diubah. Ini berarti jawabannya secara efektif, "Bukan atuple
atau adict
, tetapi sebuahobject
." +1Ini adalah pertanyaan lama apakah akan menyandikan format / skema Anda di-band atau di luar-band.
Anda menukar sebagian memori untuk mendapatkan keterbacaan dan portabilitas yang berasal dari mengekspresikan format data langsung dalam data. Jika Anda tidak melakukan ini, pengetahuan bahwa bidang pertama adalah nama file dan yang kedua adalah ukuran harus disimpan di tempat lain. Itu menghemat memori tetapi biaya keterbacaan dan portabilitas. Mana yang akan membuat perusahaan Anda mengeluarkan uang lebih banyak?
Adapun masalah abadi, ingat kekekalan tidak berarti tidak berguna dalam menghadapi perubahan. Itu berarti kita perlu mengambil lebih banyak memori, membuat perubahan dalam salinan, dan menggunakan salinan baru. Itu tidak gratis tetapi sering kali bukan pemecah kesepakatan. Kami menggunakan string abadi untuk mengubah hal-hal sepanjang waktu.
Pertimbangan lain adalah ekstensibilitas. Ketika Anda menyimpan data hanya secara posisi, tanpa menyandikan informasi format, maka Anda hanya dikutuk untuk pewarisan tunggal, yang sebenarnya hanyalah praktik menggabungkan bidang tambahan setelah bidang yang ditetapkan. Saya dapat menetapkan bidang ke-3 sebagai tanggal pembuatan dan masih kompatibel dengan format Anda karena saya mendefinisikan pertama dan kedua dengan cara yang sama.
Namun, yang tidak bisa saya lakukan adalah menyatukan dua format yang didefinisikan secara independen yang memiliki beberapa bidang yang tumpang tindih, beberapa tidak, menyimpannya dalam satu format, dan membuatnya berguna untuk hal-hal yang hanya tahu tentang satu atau format lainnya.
Untuk melakukan itu saya harus menyandikan info format dari awal. Saya perlu mengatakan "bidang ini adalah nama file". Melakukan hal itu memungkinkan pewarisan berganda.
Anda mungkin terbiasa pewarisan hanya diekspresikan dalam konteks objek tetapi ide yang sama bekerja untuk format data karena, well, objek disimpan dalam format data. Persis masalah yang sama.
Jadi gunakan mana pun yang menurut Anda paling mungkin Anda butuhkan. Saya meraih fleksibilitas kecuali saya bisa menunjukkan alasan yang baik untuk tidak melakukannya.
sumber
Saya akan menggunakan kelas dengan dua properti.
file.size
lebih baik daripada salah satufile[1]
ataufile["size"]
.Sederhana lebih baik daripada kompleks.
sumber
file = Filesize(filename='stuff.txt', size=222)
danfiletup = ("stuff.txt", 222)
keduanya menghasilkan JSON yang sama:json.dumps(file)
danjson.dumps(filetup)
menghasilkan:'["stuff.txt", 222]'
Apakah nama filenya unik? Jika demikian, Anda dapat menghapus daftar seluruhnya dan hanya menggunakan kamus murni untuk semua file. mis. (situs web hipotetis)
dll ...
Sekarang, Anda tidak mendapatkan "nama" dan "ukuran", Anda hanya menggunakan kunci dan nilai, tetapi seringkali ini lebih alami. YMMV.
Jika Anda benar - benar menginginkan "ukuran" untuk kejelasan, atau Anda membutuhkan lebih dari satu nilai untuk file, maka:
sumber
Dalam python, kamus adalah objek yang bisa berubah. Di sisi lain, tuple adalah objek abadi.
jika Anda perlu mengubah kunci kamus, pasangan nilai sering atau setiap kali. saya sarankan kamus untuk digunakan.
jika Anda memiliki data statis / tetap, saya sarankan tuple untuk digunakan.
Tapi, tidak bisa mengubah data tuple menggunakan operator penugasan.
sumber