Jadi yang saya cari di sini adalah fungsi print_r PHP .
Ini agar saya dapat men-debug skrip saya dengan melihat bagaimana keadaan objek yang dimaksud.
Jadi yang saya cari di sini adalah fungsi print_r PHP .
Ini agar saya dapat men-debug skrip saya dengan melihat bagaimana keadaan objek yang dimaksud.
Anda benar-benar mencampurkan dua hal yang berbeda.
Gunakan dir()
, vars()
atau inspect
modul untuk mendapatkan apa yang Anda minati (saya gunakan __builtins__
sebagai contoh; Anda bisa menggunakan objek apa saja).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Cetak kamus itu sesuka Anda:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
atau
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
Pencetakan cantik juga tersedia di debugger interaktif sebagai perintah:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
anggota (re.MatchObject
misalnya), tetapi builtindir()
berfungsi untuk semua objek.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
modul dalam jawaban Anda? Saya pikir itu adalah hal yang paling dekat dengan print_r atau var_dump.dir()
, lalu?dir()
hanya mengembalikan daftar nama, dan tidak semua yang ada divars()
atau dalam__dict__
atribut.Anda ingin
vars()
dicampur denganpprint()
:sumber
vars()
hanya mengembalikan__dict__
argumennya dan itu juga mundurdir()
jika tidak ada__dir__
metode. jadi gunakandir()
di tempat pertama, seperti yang saya katakan.dir()
memberi Anda semua hal bawaan yang mungkin tidak Anda sukai__str__
dan__new__
.var()
tidak.__dict__
atribut.Ada banyak fungsi pihak ke-3 di luar sana yang menambahkan hal-hal seperti penanganan pengecualian, pencetakan karakter nasional / khusus, berulang ke objek bersarang dll sesuai dengan preferensi penulisnya. Tapi mereka semua pada dasarnya bermuara pada hal ini.
sumber
getmembers()
fungsi dalaminspect
modul standar , tetapi saya pikir ini akan lebih berguna karena menggambarkan bagaimana melakukan introspeksi secara umum.__dict__
(seperti__doc__
dan__module__
). Selain itu,__dict__
tidak berfungsi sama sekali untuk objek yang dideklarasikan__slots__
. Secara umum,__dict__
memperlihatkan properti tingkat pengguna yang sebenarnya disimpan dalam kamus secara internal. dir () menunjukkan lebih banyak.__dict__
atribut / anggota. Saya tahu ini gila, tetapi benar. Built-in likeint
danstr
ataure.MatchObject
s adalah contoh umum. Coba'hello'.__dict__
, lalu cobadir('hello')
dir telah disebutkan, tetapi itu hanya akan memberi Anda nama atribut. Jika Anda ingin nilainya juga coba __dict__.
Berikut hasilnya:
sumber
set
tidak memiliki__dict__
, jadi bagi mereka itu akan gagal denganAttributeError: 'set' object has no attribute '__dict__'
Anda dapat menggunakan fungsi "dir ()" untuk melakukan ini.
Fitur lain yang bermanfaat adalah bantuan.
sumber
Untuk mencetak keadaan objek saat ini, Anda mungkin:
atau
atau
Untuk kelas Anda tentukan
__str__
atau__repr__
metode. Dari dokumentasi Python :sumber
print "DEBUG: object value: " + repr(obj)
Mungkin patut dicoba -
Apakah ada Python yang setara dengan Data Perl :: Dumper?
Rekomendasi saya adalah ini -
https://gist.github.com/1071857
Perhatikan bahwa perl memiliki modul bernama Data :: Dumper yang menerjemahkan data objek kembali ke kode sumber perl (NB: TIDAK menerjemahkan kode kembali ke sumber, dan hampir selalu Anda tidak ingin fungsi metode objek di output). Ini dapat digunakan untuk kegigihan, tetapi tujuan umumnya adalah untuk debugging.
Ada beberapa hal yang tidak dapat dicapai oleh jejak python standar, khususnya ia hanya berhenti turun ketika ia melihat instance objek dan memberi Anda pointer hex internal objek (errr, pointer itu tidak banyak digunakan oleh jalan). Jadi singkatnya, python adalah semua tentang paradigma berorientasi objek yang hebat ini, tetapi alat yang Anda dapatkan di luar kotak dirancang untuk bekerja dengan sesuatu selain objek.
Data perl :: Dumper memungkinkan Anda untuk mengontrol seberapa dalam Anda ingin pergi, dan juga mendeteksi struktur yang ditautkan melingkar (itu benar-benar penting). Proses ini secara fundamental lebih mudah untuk dicapai dalam perl karena objek tidak memiliki sihir khusus di luar berkat mereka (proses yang didefinisikan secara universal).
sumber
Saya sarankan menggunakan
help(your_object)
.help(dir)
help(vars)
sumber
Dalam kebanyakan kasus, menggunakan
__dict__
ataudir()
akan memberi Anda info yang Anda inginkan. Jika Anda membutuhkan lebih banyak detail, pustaka standar menyertakan modul inspect , yang memungkinkan Anda untuk mendapatkan sejumlah detail yang mengesankan. Beberapa saran nyata dari info termasuk:Jika Anda hanya mencari "nilai atribut apa yang dimiliki objek saya?", Maka
dir()
dan__dict__
mungkin cukup. Jika Anda benar-benar ingin menggali keadaan saat ini dari objek yang berubah-ubah (mengingat bahwa hampir semua objek adalah python), makainspect
layak untuk dipertimbangkan.sumber
Tidak. Jawaban yang paling banyak dipilih tidak menyertakan beberapa atribut, dan jawaban yang diterima menunjukkan cara mendapatkan semua atribut, termasuk metode dan bagian dari api non-publik. Tapi tidak ada builtin lengkap yang bagus fungsi untuk ini.
Jadi akibat singkatnya adalah Anda bisa menulis sendiri, tetapi akan menghitung properti dan deskriptor data yang dihitung yang merupakan bagian dari API publik, dan Anda mungkin tidak menginginkan itu:
Masalah dengan jawaban lain
Amati aplikasi jawaban terpilih saat ini di kelas dengan banyak jenis data anggota:
hanya cetak:
Karena
vars
hanya mengembalikan__dict__
objek, dan itu bukan salinan, jadi jika Anda memodifikasi dict yang dikembalikan oleh vars, Anda juga memodifikasi__dict__
objek itu sendiri.pengembalian:
- yang buruk karena quux adalah properti yang seharusnya tidak kita atur dan tidak boleh berada di namespace ...
Menerapkan saran dalam jawaban yang saat ini diterima (dan lainnya) tidak jauh lebih baik:
Seperti yang dapat kita lihat,
dir
hanya mengembalikan semua (sebenarnya hanya sebagian besar) dari nama yang terkait dengan objek.inspect.getmembers
, disebutkan dalam komentar, juga cacat - mengembalikan semua nama dan nilai.Dari kelas
Saat mengajar, saya meminta siswa saya membuat fungsi yang menyediakan API objek semantik yang publik:
Kita dapat memperluas ini untuk memberikan salinan namespace semantik dari suatu objek, tetapi kita perlu mengecualikan
__slots__
yang tidak ditugaskan, dan jika kita menanggapi permintaan "properti saat ini" dengan serius, kita perlu mengecualikan properti yang dihitung (seperti mereka bisa menjadi mahal, dan bisa diartikan sebagai bukan "saat ini"):Dan sekarang kami tidak menghitung atau menampilkan properti, quux:
Peringatan
Tapi mungkin kita tahu properti kita tidak mahal. Kami mungkin ingin mengubah logika untuk memasukkan mereka juga. Dan mungkin kami ingin mengecualikan deskriptor data khusus lainnya .
Maka kita perlu menyesuaikan fungsi ini lebih lanjut. Maka masuk akal bahwa kita tidak dapat memiliki fungsi bawaan yang secara ajaib tahu persis apa yang kita inginkan dan menyediakannya. Ini adalah fungsi yang perlu kita ciptakan sendiri.
Kesimpulan
Tidak ada fungsi bawaan yang melakukan ini, dan Anda harus melakukan apa yang paling semantik sesuai dengan situasi Anda.
sumber
FunctionType
. Tetapi sangat membantu - terima kasih!Contoh metaprogramming objek Dump dengan sihir :
Tanpa argumen:
Dengan Utilitas Gnosis :
Agak ketinggalan jaman tetapi masih berfungsi.
sumber
Jika Anda menggunakan ini untuk debugging, dan Anda hanya ingin dump rekursif dari semuanya, jawaban yang diterima tidak memuaskan karena mengharuskan kelas Anda sudah memiliki
__str__
implementasi yang baik . Jika bukan itu masalahnya, ini bekerja lebih baik:sumber
TypeError: vars() argument must have __dict__ attribute
Coba ppretty
Keluaran:
sumber
sumber
Ini mencetak semua konten objek secara rekursif dalam format indentasi json atau yaml:
sumber
Saya telah mengangkat jawaban yang hanya menyebutkan sidik jari. Untuk menjadi jelas, jika Anda ingin melihat semua nilai dalam struktur data yang kompleks, maka lakukan sesuatu seperti:
Di mana my_var adalah variabel yang Anda minati. Ketika saya menggunakan,
pprint(vars(my_var))
saya tidak mendapatkan apa-apa, dan jawaban lain di sini tidak membantu atau metode itu tampak terlalu lama. Ngomong-ngomong, dalam kasus khusus saya, kode yang saya periksa memiliki kamus kamus.Layak menunjukkan bahwa dengan beberapa kelas khusus Anda mungkin berakhir dengan
<someobject.ExampleClass object at 0x7f739267f400>
jenis output yang tidak membantu . Dalam hal ini, Anda mungkin harus menerapkan__str__
metode, atau mencoba beberapa solusi lain. Saya masih ingin menemukan sesuatu yang sederhana yang berfungsi di semua skenario, tanpa perpustakaan pihak ketiga.sumber
Saya perlu mencetak info DEBUG di beberapa log dan tidak dapat menggunakan pprint karena akan merusaknya. Sebaliknya saya melakukan ini dan mendapatkan hal yang hampir sama.
sumber
Untuk membuang "myObject":
Saya mencoba vars () dan dir (); keduanya gagal untuk apa yang saya cari. vars () tidak berfungsi karena objek tidak memiliki __dict__ (pengecualian .TypeError: vars () argumen harus memiliki atribut __dict__). dir () bukan yang saya cari: itu hanya daftar nama bidang, tidak memberikan nilai atau struktur objek.
Saya pikir json.dumps () akan bekerja untuk sebagian besar objek tanpa default = json_util.default, tetapi saya memiliki bidang datetime di objek sehingga serializer json gagal. Lihat Bagaimana mengatasi "datetime.datetime not JSON serializable" dengan python?
sumber
Mengapa bukan sesuatu yang sederhana:
sumber
for key,value in obj.__dict__.iteritems(): print key,value
?pprint berisi "printer cantik" untuk menghasilkan representasi struktur data Anda yang menyenangkan secara estetis. Formatter menghasilkan representasi struktur data yang dapat diurai dengan benar oleh penerjemah, dan juga mudah bagi manusia untuk dibaca. Output disimpan pada satu baris, jika mungkin, dan menjorok ketika terbagi beberapa baris.
sumber
Coba cetak ulang .
Ini akan membantu Anda tidak hanya dengan mencetak variabel objek, tetapi juga output yang indah, seperti ini:
sumber
Untuk semua orang yang berjuang
vars()
tidak mengembalikan semua atribut.dir()
tidak mengembalikan nilai atribut.Kode berikut mencetak semua atribut
obj
dengan nilainya:sumber
Anda dapat mencoba Flask Debug Toolbar.
https://pypi.python.org/pypi/Flask-DebugToolbar
sumber
Saya suka bekerja dengan objek atau nilai - nilai kunci objek python .
Untuk atribut terlepas dari itu adalah metode atau variabel:
Untuk nilai atribut tersebut:
sumber
Ini berfungsi tidak masalah bagaimana variabel Anda didefinisikan di dalam kelas, di dalam __init__ atau di luar.
sumber