Saya mulai membuat kode dalam berbagai proyek menggunakan Python (termasuk pengembangan web Django dan pengembangan game Panda3D).
Untuk membantu saya memahami apa yang terjadi, pada dasarnya saya ingin 'melihat' di dalam objek Python untuk melihat bagaimana mereka menandai - seperti metode dan properti mereka.
Jadi katakan saya memiliki objek Python, apa yang saya perlukan untuk mencetak isinya? Apakah itu mungkin?
python
introspection
littlejim84
sumber
sumber
object.__dict__
sumber
vars(object)
dibuat untuk itu.from pprint import pprint; pprint(vars(object))
memberi saya pandangan yang sangat bagus pada isi objek saya. Terima kasih @liberforcePertama, baca sumbernya.
Kedua, gunakan
dir()
fungsinya.sumber
Saya terkejut belum ada bantuan yang disebutkan!
Bantuan memungkinkan Anda membaca dokumen dan mendapatkan gagasan tentang atribut apa yang mungkin dimiliki kelas, yang cukup membantu.
sumber
Jika ini untuk eksplorasi untuk melihat apa yang terjadi, saya akan merekomendasikan melihat IPython . Ini menambahkan berbagai cara pintas untuk mendapatkan dokumentasi objek, properti, dan bahkan kode sumber. Misalnya menambahkan "?" untuk suatu fungsi akan memberikan bantuan untuk objek (secara efektif pintas untuk "help (obj)", sedangkan menggunakan dua? ((
func??
")) akan menampilkan kode sumber jika tersedia.Ada juga banyak kenyamanan tambahan, seperti penyelesaian tab, pencetakan hasil yang cantik, riwayat hasil dll. Yang membuatnya sangat berguna untuk pemrograman penjelajahan semacam ini.
Untuk penggunaan lebih program introspeksi, builtin dasar seperti
dir()
,vars()
,getattr
dll akan berguna, tetapi juga bernilai waktu Anda untuk memeriksa memeriksa modul. Untuk mengambil sumber suatu fungsi, gunakan "inspect.getsource
" mis., Terapkan pada dirinya sendiri:inspect.getargspec
juga sering berguna jika Anda berurusan dengan fungsi pembungkus atau manipulasi, karena akan memberikan nama dan nilai default dari parameter fungsi.sumber
Jika Anda tertarik pada GUI untuk ini, lihatlah objbrowser . Ia menggunakan modul inspect dari library standar Python untuk introspeksi objek di bawahnya.
sumber
Anda bisa daftar atribut objek dengan dir () di shell:
Tentu saja, ada juga modul pemeriksa: http://docs.python.org/library/inspect.html#module-inspect
sumber
sumber
Coba ppretty
Keluaran:
sumber
Orang lain telah menyebutkan dir () built-in yang terdengar seperti apa yang Anda cari, tapi inilah tip lain yang bagus. Banyak perpustakaan - termasuk sebagian besar perpustakaan standar - didistribusikan dalam bentuk sumber. Berarti Anda dapat dengan mudah membaca kode sumber secara langsung. Kuncinya adalah menemukannya; sebagai contoh:
File * .pyc dikompilasi, jadi hapus trailing 'c' dan buka file * .py yang belum dikompilasi di editor atau penampil file favorit Anda:
Saya menemukan ini sangat berguna untuk menemukan hal-hal seperti pengecualian yang dimunculkan dari API yang diberikan. Detail seperti ini jarang didokumentasikan dengan baik di dunia Python.
sumber
Meskipun
pprint
telah disebutkan oleh orang lain, saya ingin menambahkan beberapa konteks.pprint
mungkin diminati oleh pengembang dengan latar belakang PHP yang mencari alternatifvar_dump()
.Objek dengan atribut dict dapat dibuang dengan baik menggunakan
pprint()
mixed withvars()
, yang mengembalikan__dict__
atribut untuk modul, kelas, instance, dll .:Jadi, tidak perlu loop .
Untuk membuang semua variabel yang ada dalam lingkup global atau lokal cukup gunakan:
locals()
menunjukkan variabel yang didefinisikan dalam suatu fungsi.Ini juga berguna untuk mengakses fungsi dengan nama terkait sebagai kunci string, di antara penggunaan lainnya :
Demikian pula, menggunakan
dir()
untuk melihat isi modul, atau atribut suatu objek.Dan masih ada lagi.
sumber
Jika Anda ingin melihat parameter dan metode, seperti yang ditunjukkan orang lain, Anda dapat menggunakan
pprint
ataudir()
Jika Anda ingin melihat nilai sebenarnya dari konten, Anda bisa melakukannya
object.__dict__
sumber
Dua alat hebat untuk memeriksa kode adalah:
IPython . Terminal python yang memungkinkan Anda untuk memeriksa menggunakan penyelesaian tab.
Gerhana dengan plugin PyDev . Ini memiliki debugger yang sangat baik yang memungkinkan Anda untuk istirahat di tempat tertentu dan memeriksa objek dengan menelusuri semua variabel sebagai pohon. Anda bahkan dapat menggunakan terminal tertanam untuk mencoba kode di tempat itu atau mengetik objek dan tekan '.' untuk memilikinya berikan petunjuk kode untuk Anda.
sumber
cetak dan dir bersama-sama bekerja dengan baik
sumber
Ada pustaka kode python yang dibuat hanya untuk tujuan ini: periksa Diperkenalkan dengan Python 2.7
sumber
Jika Anda tertarik untuk melihat kode sumber fungsi yang sesuai dengan objek
myobj
, Anda dapat mengetikiPython
atauJupyter Notebook
:myobj??
sumber
atau
sumber
Jika Anda ingin melihat ke dalam objek hidup, maka
inspect
modul python adalah jawaban yang bagus. Secara umum, ini berfungsi untuk mendapatkan kode sumber fungsi yang didefinisikan dalam file sumber di suatu tempat di disk. Jika Anda ingin mendapatkan sumber fungsi langsung dan lambda yang didefinisikan dalam juru bahasa, Anda dapat menggunakandill.source.getsource
daridill
. Ia juga bisa mendapatkan kode dari metode dan fungsi kelas yang diikat atau tidak terikat yang didefinisikan dalam kari ... namun, Anda mungkin tidak dapat mengkompilasi kode itu tanpa kode objek yang dilampirkan.sumber
vars (obj) mengembalikan atribut suatu objek.
sumber
Selain itu jika Anda ingin melihat ke dalam daftar dan kamus, Anda dapat menggunakan pprint ()
sumber
Sudah banyak tip bagus, tetapi yang terpendek dan termudah (belum tentu yang terbaik) belum disebutkan:
sumber
Coba gunakan:
object
nama variabel dari objek yang Anda coba periksa.Ini mencetak output yang diformat dengan baik dan tab yang menunjukkan semua hierarki kunci dan nilai-nilai dalam objek.
CATATAN: Ini berfungsi di python3. Tidak yakin apakah itu berfungsi di versi sebelumnya
PEMBARUAN: Ini tidak berfungsi pada semua jenis objek. Jika Anda menemukan salah satu dari tipe tersebut (seperti objek Permintaan), gunakan salah satu dari berikut ini sebagai gantinya:
dir(object())
atau
import pprint
kemudian:pprint.pprint(object.__dict__)
sumber