Saya memiliki kelas tuple bernama dalam python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Saya ingin mengonversi instance Town menjadi kamus. Saya tidak ingin itu terikat ketat dengan nama atau jumlah bidang di Kota.
Apakah ada cara untuk menulisnya sehingga saya bisa menambahkan lebih banyak bidang, atau mengoper tuple bernama yang sama sekali berbeda dan mendapatkan kamus.
Saya tidak dapat mengubah definisi kelas asli seperti dalam kode orang lain. Jadi saya perlu mengambil contoh dari Kota dan mengubahnya menjadi kamus.
python
dictionary
tuples
namedtuple
Tanpa Aku Ini Hanya Aweso
sumber
sumber
dir
perintah, yang akan menampilkan bidang untuk objek apa pun ... yang akan menunjukkan_asdict
fungsi secara langsung.dict
alih-alih 'namedtuple', dan meneruskan namesuple ke inisialisasi. Ingat bahwa jika Anda terbiasa dengan Cxx,class Town(x)
bukan konstruktornya,def __init__(self, *args, **kwargs)
di dalamnya ada.dir
hanyalah sebuah python built-in ... Anda dapat menjalankannya pada objek python apa saja , di konsol atau dalam skrip (di mana ia mengembalikan daftar yang dapat Anda cetak atau lakukan apa saja dengan), dan itu akan mengembalikan daftar (hampir ) semua atribut objek. membantu jika Anda mencoba mencari tahu cara kerja objek yang tidak dikenal.Jawaban:
TL; DR: ada metode yang
_asdict
disediakan untuk ini.Berikut ini adalah demonstrasi penggunaannya:
Ini adalah metode yang terdokumentasi dari namestuple, yaitu tidak seperti konvensi biasa dalam python garis bawah utama pada nama metode tidak ada untuk mencegah penggunaan . Seiring dengan metode lain ditambahkan ke namedtuples,
_make
,_replace
,_source
,_fields
, ia memiliki garis bawah hanya untuk mencoba dan mencegah konflik dengan kemungkinan nama field.Catatan: Untuk kode 2.7.5 <python <<.0.0 keluar di alam bebas, Anda mungkin melihat versi ini:
Untuk sementara dokumentasi menyebutkan bahwa
_asdict
itu sudah usang (lihat di sini ), dan menyarankan untuk menggunakan metode built-in vars . Nasihat itu sekarang sudah ketinggalan zaman; untuk memperbaiki bug yang terkait dengan subclassing,__dict__
properti yang ada di namestuples telah dihapus oleh komit ini .sumber
_asdict
tidak boleh alias di perpustakaan standarasdict
?"asdict"
menjadi salah satu nama tuple.Ada metode
namedtuple
bawaan pada instance untuk ini_asdict
,.Seperti yang dibahas dalam komentar, pada beberapa versi
vars()
juga akan melakukannya, tetapi tampaknya sangat bergantung pada detail bangunan, padahal_asdict
seharusnya dapat diandalkan. Dalam beberapa versi_asdict
ditandai sebagai usang, tetapi komentar menunjukkan bahwa ini tidak lagi berlaku pada 3.4.sumber
_asdict
metode ini telah usang dalam python3 (mendukung vars)vars
berfungsi pada beberapa versi yang lebih lama - pada 2.7 itu memunculkanTypeError
, karenanamedtuple
kelas versi itu tidak memiliki__dict__
atribut.Pada Ubuntu 14,04 LTS versi python2.7 dan python3.4
__dict__
properti bekerja seperti yang diharapkan. The_asdict
Metode juga bekerja, tapi aku cenderung untuk menggunakan standar yang ditetapkan, seragam, api properti bukan lokal api non-seragam.$ python2.7
Melihat sebagai dikt adalah cara semantik untuk mendapatkan kamus yang mewakili segalanya, (setidaknya menurut pengetahuan saya).
Akan menyenangkan untuk mengakumulasi tabel versi dan platform python utama dan dukungannya untuk
__dict__
, saat ini saya hanya memiliki satu versi platform dan dua versi python seperti yang diposting di atas.sumber
__dict__
tidak berfungsi.Kasus # 1: tuple satu dimensi
Kasus # 2: Dua dimensi tuple
Contoh: DICT_ROLES [961] # akan menampilkan 'Back-End Programmer'
sumber
jika tidak ada _asdict (), Anda dapat menggunakan cara ini:
sumber
Python 3. Alokasikan bidang apa pun ke kamus sebagai indeks yang diperlukan untuk kamus, saya menggunakan 'nama'.
sumber