Saya ingin bisa mendapatkan nama variabel sebagai string tetapi saya tidak tahu apakah Python memiliki banyak kemampuan introspeksi. Sesuatu seperti:
>>> print(my_var.__name__)
'my_var'
Saya ingin melakukan itu karena saya memiliki banyak variabel yang ingin saya ubah menjadi kamus seperti:
bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}
Tetapi saya ingin sesuatu yang lebih otomatis dari itu.
Python punya locals()
dan vars()
, jadi saya kira ada cara.
Jawaban:
Apakah Anda mencoba melakukan ini?
Contoh
sumber
print('x: ' + x)
seseorang dapat menulismagic_print(x)
dan memiliki output yang sama tanpa menulis nama variabel dua kali.Seperti kata bersantai, ini bukan sesuatu yang Anda lakukan dengan Python - variabel sebenarnya adalah pemetaan nama objek.
Namun , inilah salah satu cara untuk mencoba dan melakukannya:
sumber
True
), maka nama variabel yang tidak diinginkan mungkin dikembalikan.id(v) == id(a)
bukannyav is a
? Ini akan gagal untuk objek yang terikat ke beberapa variabel, seperti int, string, dan tipe yang didefinisikan pengguna yang diimplementasikan secara serupa.v is a
akan menjadi pilihan yang lebih baik. Dan ya, tentu berbahaya mengingat semua potensi jebakan yang bisa muncul! ;-)Saya ingin melakukan ini cukup banyak. Retasan ini sangat mirip dengan saran rlotun, tapi ini hanya satu-baris, yang penting bagi saya:
Python 3+
sumber
iteritems()
digantikan olehitems()
spam = 1; blah = 1; blah_name = [ k for k,v in locals().items() if v is blah][0]; print(blah_name)
Outputspam
spam = 1, blah = 1; assert spam is blah
. Solusinya terputus ketika membandingkan tipe data primitif.Ini adalah retasan. Itu tidak akan bekerja pada semua distribusi implementasi Python (khususnya, mereka yang tidak punya
traceback.extract_stack
.)Perhatikan bahwa peretasan ini rapuh:
(memanggil make_dict pada 2 baris) tidak akan berfungsi.
Alih-alih mencoba menghasilkan dict dari nilai - nilai
foo
danbar
, itu akan jauh lebih Pythonic untuk menghasilkan dict dari nama variabel string'foo'
dan'bar'
:sumber
print("a_very_long_name: {}'.format(a_very_long_name))
siapa yang peduli!Ini tidak mungkin dalam Python, yang benar-benar tidak memiliki "variabel". Python memiliki nama, dan mungkin ada lebih dari satu nama untuk objek yang sama.
sumber
Saya pikir masalah saya akan membantu mengilustrasikan mengapa pertanyaan ini bermanfaat, dan mungkin memberikan sedikit lebih banyak wawasan tentang bagaimana menjawabnya. Saya menulis fungsi kecil untuk melakukan cek inline cepat pada berbagai variabel dalam kode saya. Pada dasarnya, ini mencantumkan nama variabel, tipe data, ukuran, dan atribut lainnya, jadi saya dapat dengan cepat menangkap kesalahan yang saya buat. Kode ini sederhana:
Jadi, jika Anda memiliki situasi kamus / daftar / tuple yang rumit, akan sangat membantu jika juru bahasa mengembalikan nama variabel yang Anda tetapkan. Misalnya, ini kamus yang aneh:
Saya tidak yakin apakah saya meletakkan ini di tempat yang tepat, tetapi saya pikir itu mungkin membantu. Saya harap begitu.
sumber
myconnection
bisa menunjuk ke nilai boolean pada satu titik, bilangan bulat di waktu lain, dan koneksi soket di titik lain dalam eksekusi kode ??Saya menulis fungsi kecil yang rapi dan bermanfaat berdasarkan jawaban untuk pertanyaan ini. Saya taruh di sini kalau-kalau berguna.
pemakaian:
sumber
Saya menemukan bahwa jika Anda sudah memiliki daftar nilai tertentu, cara itu dijelaskan oleh @S. Lotts adalah yang terbaik; Namun, cara yang dijelaskan di bawah ini berfungsi dengan baik untuk mendapatkan semua variabel dan Kelas ditambahkan di seluruh kode TANPA perlu memberikan nama variabel meskipun Anda dapat menentukan mereka jika Anda mau. Kode dapat diperluas untuk mengecualikan Kelas.
Keluaran:
sumber
Dalam python 3 ini mudah
ini akan mencetak:
sumber
for v in locals()
.for v in list(locals()):
Python3. Gunakan inspect untuk menangkap namespace lokal panggilan lalu gunakan ide yang disajikan di sini. Dapat mengembalikan lebih dari satu jawaban seperti yang telah ditunjukkan.
sumber
Inilah fungsi yang saya buat untuk membaca nama variabel. Ini lebih umum dan dapat digunakan dalam berbagai aplikasi:
Untuk menggunakannya dalam pertanyaan yang ditentukan:
sumber
Saat membaca utas, saya melihat banyak sekali gesekan. Cukup mudah untuk memberikan jawaban yang buruk, lalu biarkan seseorang memberikan jawaban yang benar. Bagaimanapun, inilah yang saya temukan.
Dari: [effbot.org] ( http://effbot.org/zone/python-objects.htm#names )
Namanya sedikit berbeda - mereka tidak benar-benar properti objek, dan objek itu sendiri tidak tahu apa namanya.
Objek dapat memiliki sejumlah nama, atau tidak ada nama sama sekali.
Nama-nama tinggal di namespace (seperti module namespace, instance namespace, namespace lokal fungsi).
Catatan: itu tertulis objek itu sendiri tidak tahu apa namanya , jadi itu adalah petunjuknya. Objek python tidak merujuk pada diri sendiri. Kemudian dikatakan, Nama tinggal di ruang nama . Kami memilikinya di TCL / TK. Jadi mungkin jawaban saya akan membantu (tapi itu memang membantu saya)
Jadi ada 'jj' di akhir daftar.
Tulis ulang kode sebagai:
Ini sedikit jahat kode id nama variabel / objek / apa pun-Anda-pedantik-panggilan-itu.
Jadi begitulah. Alamat memori 'jj' adalah sama ketika kita mencarinya secara langsung, seperti ketika kita melakukan kamus mencari di ruang nama global. Saya yakin Anda dapat membuat fungsi untuk melakukan ini. Ingat saja namespace tempat variabel / objek / wypci Anda berada.
QED.
sumber
print id(jj)
. Yang kedua hanya mencari nama, dan dapat dilakukan dengan lebih mudahvars()
.Mungkin aku terlalu memikirkan ini tapi ..
sumber
variable = 1 \n [k for k,v in locals().items() if id(variable) == id(v)] \n Out[14]: ['variable']
sumber
Saya mengunggah solusi ke pypi . Ini adalah modul yang mendefinisikan setara dengan
nameof
fungsi C # .Itu iterates melalui instruksi bytecode untuk frame yang dipanggil, mendapatkan nama-nama variabel / atribut yang diteruskan ke sana. Nama-nama yang ditemukan dalam
.argrepr
dariLOAD
instruksi berikut nama fungsi.sumber
Saya menulis paket sihir untuk melakukan sihir semacam ini dengan kuat. Kamu bisa menulis:
sumber
Sebagian besar objek tidak memiliki atribut __name__ . (Kelas, fungsi, dan modul melakukan; ada lagi tipe builtin yang memilikinya?)
Apa lagi yang Anda harapkan
print(my_var.__name__)
selainprint("my_var")
? Bisakah Anda menggunakan string secara langsung?Anda bisa "mengiris" sebuah dikt:
Kalau tidak:
sumber
some_func(var)
, jadi saya mencoba menunjukkan bahwa tidak jauh dari situsome_func("var")
, dengan dictslice memungkinkan Anda mendapatkan pemetaan nilai-nama untuk beberapa variabel sekaligus.Yah, aku menemui yang sama kebutuhan beberapa hari yang lalu dan harus mendapatkan variabel nama yang menunjuk ke objek itu sendiri.
Dan mengapa itu sangat diperlukan?
Singkatnya saya sedang membangun plug-in untuk Maya . Plug-in inti dibangun menggunakan C ++ tetapi GUI ditarik melalui Python (karena bukan prosesor yang intensif). Karena saya, sampai sekarang, tidak tahu bagaimana cara
return
beberapa nilai dari plug-in kecuali defaultMStatus
, oleh karena itu untuk memperbarui kamus dengan Python saya harus memberikan nama variabel, menunjuk ke objek yang mengimplementasikan GUI dan yang berisi kamus itu sendiri, untuk plug-in dan kemudian gunakanMGlobal::executePythonCommand()
untuk memperbarui kamus dari lingkup global Maya .Untuk melakukan itu apa yang saya lakukan adalah sesuatu seperti:
Saya tahu itu bukan solusi sempurna di dalam
globals
banyak tombol yang dapat menunjuk ke objek yang sama, misalnya:dan bahwa pendekatannya tidak aman. Koreksi saya jika saya salah.
Setidaknya pendekatan ini menyelesaikan masalah saya dengan mendapatkan nama variabel apa pun dalam lingkup global yang menunjuk ke objek itu sendiri dan meneruskannya ke plug-in, sebagai argumen, untuk digunakan secara internal.
Saya mencoba ini
int
(kelas integer primitif) tetapi masalahnya adalah bahwa kelas-kelas primitif ini tidak dilewati (perbaiki istilah teknis yang digunakan jika salah). Anda bisa menerapkan kembaliint
dan kemudian melakukannyaint = foo
tetapia = 3
tidak akan pernah menjadi objekfoo
selain dari primitif. Untuk mengatasinya Anda harusa = foo(3)
mulaia.name()
bekerja.sumber
Dengan python 2.7 dan yang lebih baru ada juga pemahaman kamus yang membuatnya sedikit lebih pendek. Jika mungkin saya akan menggunakan getattr sebagai gantinya eval (eval is evil) seperti pada jawaban teratas. Diri dapat berupa objek apa pun yang memiliki konteks yang Anda lihat. Ini bisa berupa objek atau penduduk lokal = penduduk lokal () dll.
sumber
Saya sedang mengerjakan masalah yang sama. @ S.Lott berkata, "Jika Anda memiliki daftar variabel, apa gunanya" menemukan "nama mereka?" Dan jawaban saya hanya untuk melihat apakah itu bisa dilakukan dan jika karena alasan tertentu Anda ingin mengurutkan variabel Anda dengan mengetikkan ke dalam daftar. Jadi, bagaimanapun, dalam penelitian saya, saya menemukan utas ini dan solusi saya sedikit diperluas dan didasarkan pada solusi @rlotun. Satu hal lagi, @unutbu berkata, "Gagasan ini pantas, tetapi perhatikan bahwa jika dua nama variabel mereferensikan nilai yang sama (misalnya Benar), maka nama variabel yang tidak diinginkan mungkin dikembalikan." Dalam latihan ini yang benar jadi saya berurusan dengan itu dengan menggunakan daftar pemahaman seperti ini untuk setiap kemungkinan:
isClass = [i for i in isClass if i != 'item']
. Tanpanya "item" akan muncul di setiap daftar.sumber
pi = pie
ke kode Anda, Anda akan mendapatkan entri tambahan dalamisFloat
daftar Anda . Jika Anda menambahkantuple_1[0]
kemixedDataTypes
daftar Anda , tidak ada nama yang akan ditemukan untuk itu meskipun "satu" ada dalam kode Anda dua kali (meskipun berkat string magang, mereka berdua akan menjadi referensi ke objek yang sama).pi
dane
sebagai variabel menyebabkan output yang tidak diinginkan dan itu karena keduanya adalah bagian darimath
perpustakaan. Bagi saya ini hanya latihan untuk melihat apakah itu bisa dilakukan meskipun hasil akhirnya tidak sempurna. Dalam pembelajaran saya tentang bahasa ini membaca buku hanya berjalan sejauh ini. Menurut pendapat saya, jika Anda benar-benar ingin belajar bahasa maka Anda harus bermain "bagaimana jika" dan melihat apa yang Anda hasilkan.Anda dapat menggunakan easydict
contoh lain:
sumber
Pada python3, fungsi ini akan mendapatkan nama paling luar di stack:
Ini berguna di mana saja pada kode. Lintasi tumpukan terbalik untuk mencari kecocokan pertama.
sumber
Meskipun ini mungkin ide yang buruk, ini sejalan dengan jawaban rlotun tetapi akan mengembalikan hasil yang benar lebih sering.
Anda menyebutnya seperti ini:
sumber
harus mendapatkan daftar lalu kembali
sumber
Itu tidak akan mengembalikan nama variabel tetapi Anda dapat membuat kamus dari variabel global dengan mudah.
sumber
Dengan
python-varname
Anda dapat dengan mudah melakukannya:pip install python-varname
Penafian: Saya penulis perpustakaan python-varname.
sumber
cara ini mendapatkan varname untuk mungkin 'a' atau 'b'.
sumber