Bagaimana cara menyelesaikan variabel variabel dalam Python?
Berikut ini adalah entri manual elaboratif, misalnya: Variabel variabel
Saya telah mendengar ini adalah ide yang buruk secara umum, dan itu adalah lubang keamanan di Python. Benarkah?
python
variable-variables
Taryn
sumber
sumber
Jawaban:
Anda dapat menggunakan kamus untuk mencapai ini. Kamus adalah penyimpan kunci dan nilai.
Anda dapat menggunakan nama kunci variabel untuk mencapai efek variabel variabel tanpa risiko keamanan.
Untuk kasus-kasus di mana Anda berpikir untuk melakukan sesuatu seperti
daftar mungkin lebih tepat daripada dict. Daftar mewakili urutan objek yang diurutkan, dengan indeks integer:
Untuk urutan memerintahkan, daftar lebih mudah daripada dicts dengan kunci integer, karena daftar mendukung iterasi agar indeks, mengiris ,
append
dan operasi lainnya yang mengharuskan manajemen kunci canggung dengan dict.sumber
Gunakan
getattr
fungsi bawaan untuk mendapatkan atribut pada objek dengan nama. Ubah nama sesuai kebutuhan.sumber
Itu bukan ide yang bagus. Jika Anda mengakses variabel global yang dapat Anda gunakan
globals()
.Jika Anda ingin mengakses variabel dalam lingkup lokal yang dapat Anda gunakan
locals()
, tetapi Anda tidak dapat menetapkan nilai ke dikt yang dikembalikan.Solusi yang lebih baik adalah dengan menggunakan
getattr
atau menyimpan variabel Anda dalam kamus dan kemudian mengaksesnya dengan nama.sumber
x = "foo"
danlocals()["x"] = "bar"
digunakanprint x
memberikan outputbar
untuk Jython 2.5.2. Ini diuji dengan Script On Demand Automation dalam maximo .Kapan pun Anda ingin menggunakan variabel variabel, mungkin lebih baik menggunakan kamus. Jadi alih-alih menulis
Anda menulis
Dengan cara ini Anda tidak akan secara tidak sengaja menimpa variabel yang sudah ada sebelumnya (yang merupakan aspek keamanan) dan Anda dapat memiliki "ruang nama" yang berbeda.
sumber
Coders baru terkadang menulis kode seperti ini:
Coder kemudian dibiarkan dengan tumpukan variabel bernama, dengan upaya pengkodean O ( m * n ), di mana m adalah jumlah variabel bernama dan n adalah berapa kali kelompok variabel perlu diakses (termasuk pembuatan ). Pemula yang lebih cerdik mengamati bahwa satu-satunya perbedaan dalam setiap baris tersebut adalah angka yang berubah berdasarkan aturan, dan memutuskan untuk menggunakan loop. Namun, mereka terjebak pada cara membuat nama variabel secara dinamis, dan dapat mencoba sesuatu seperti ini:
Mereka segera menemukan bahwa ini tidak berhasil.
Jika program membutuhkan "nama" variabel arbitrer, kamus adalah pilihan terbaik, seperti dijelaskan dalam jawaban lain. Namun, jika Anda hanya mencoba membuat banyak variabel dan Anda tidak keberatan merujuknya dengan urutan bilangan bulat, Anda mungkin mencari a
list
. Ini terutama benar jika data Anda homogen, seperti pembacaan suhu harian, skor kuis mingguan, atau kisi-kisi widget grafis.Ini dapat dirakit sebagai berikut:
Ini
list
juga dapat dibuat dalam satu baris dengan pemahaman:Hasil dalam kedua kasus adalah populasi
list
, dengan elemen pertama diakses denganmy_calculator.buttons[0]
, berikutnya denganmy_calculator.buttons[1]
, dan seterusnya. Nama variabel "dasar" menjadi namalist
dan pengidentifikasi yang bervariasi digunakan untuk mengaksesnya.Akhirnya, jangan lupa struktur data lain, seperti
set
- ini mirip dengan kamus, kecuali bahwa setiap "nama" tidak memiliki nilai yang melekat padanya. Jika Anda hanya membutuhkan "tas" benda, ini bisa menjadi pilihan yang bagus. Alih-alih sesuatu seperti ini:Anda akan memiliki ini:
Gunakan
list
untuk urutan objek yang serupa,set
untuk tas yang dipesan secara sewenang-wenang, ataudict
untuk kantong nama dengan nilai terkait.sumber
Alih-alih kamus Anda juga dapat menggunakan
namedtuple
dari modul koleksi, yang membuat akses lebih mudah.Sebagai contoh:
sumber
Jika Anda tidak ingin menggunakan objek apa pun, Anda masih bisa menggunakan
setattr()
di dalam modul Anda saat ini:sumber
__dict__
variabel. Aku ingin tahu apakah ada mekanisme umum untuk membuat setiap variabel global secara dinamis.globals()
dapat melakukan iniThe
SimpleNamespace
kelas dapat digunakan untuk membuat atribut baru dengansetattr
, atau subclassSimpleNamespace
dan membuat fungsi sendiri untuk menambahkan nama atribut baru (variabel).sumber
Saya menjawab pertanyaan: Bagaimana cara mendapatkan nilai dari variabel yang diberi nama dalam sebuah string? yang ditutup sebagai duplikat dengan tautan ke pertanyaan ini.
Jika variabel yang dimaksud adalah bagian dari sebuah objek (bagian dari kelas misalnya) maka beberapa fungsi yang berguna untuk mencapai hal itu adalah
hasattr
,getattr
, dansetattr
.Jadi misalnya Anda dapat memiliki:
Maka Anda dapat melakukan:
sumber
Menggunakan
globals()
Anda sebenarnya dapat menetapkan variabel ke cakupan global secara dinamis, misalnya, jika Anda ingin 10 variabel yang dapat diakses pada cakupan global
i_1
,i_2
...i_10
:Ini akan menetapkan 'a' untuk semua 10 variabel ini, tentu saja Anda dapat mengubah nilai secara dinamis juga. Semua variabel ini dapat diakses sekarang seperti variabel lain yang dideklarasikan secara global:
sumber
Anda harus menggunakan
globals()
metode bawaan untuk mencapai perilaku itu:sumber
Konsensus adalah menggunakan kamus untuk ini - lihat jawaban lain. Ini adalah ide yang bagus untuk sebagian besar kasus, namun ada banyak aspek yang timbul dari ini:
Yang mengatakan, saya telah mengimplementasikan variabel variabel manajer- kelas yang menyediakan beberapa ide di atas. Ini berfungsi untuk python 2 dan 3.
Anda akan menggunakan kelas seperti ini:
Jika Anda ingin mengizinkan penimpaan variabel dengan tipe yang sama saja:
sumber
Saya telah mencoba keduanya dengan python 3.7.3, Anda dapat menggunakan globals () atau vars ()
Referensi:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936
sumber
Setiap set variabel juga dapat dibungkus dalam suatu kelas. Variabel "Variabel" dapat ditambahkan ke instance kelas selama runtime dengan secara langsung mengakses kamus bawaan melalui atribut __dict__.
Kode berikut mendefinisikan kelas Variabel, yang menambahkan variabel (dalam hal ini atribut) ke instance-nya selama konstruksi. Nama variabel diambil dari daftar yang ditentukan (yang, misalnya, bisa dihasilkan oleh kode program):
sumber