dir(re.compile(pattern))
tidak mengembalikan pola sebagai salah satu elemen daftar. Yaitu mengembalikan:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Menurut manual, seharusnya berisi
nama atribut objek, nama atribut kelasnya, dan secara rekursif atribut dari kelas dasar kelasnya.
Dikatakan juga itu
Daftar ini belum tentu lengkap.
Apakah ada cara untuk mendapatkannya? daftar lengkap ? Saya selalu berasumsi bahwa dir mengembalikan daftar lengkap tetapi ternyata itu tidak ...
Juga: apakah ada cara untuk membuat daftar hanya atribut? Atau hanya metode?
Sunting: ini sebenarnya adalah bug dalam python -> yang seharusnya diperbaiki di cabang 3.0 (dan mungkin juga di 2.6)
dir()
atau memeriksa modul biasanya merupakan cara yang tepat untuk melakukannya. Apakah Anda menggunakanre
modul hanya sebagai contoh atau Anda ingin mencapai tujuan khusus?__dir__()
Jawaban:
Untuk lengkap daftar atribut, jawaban singkatnya adalah: tidak ada. Masalahnya adalah bahwa atribut sebenarnya didefinisikan sebagai argumen yang diterima oleh
getattr
fungsi bawaan. Karena pengguna dapat menerapkan kembali__getattr__
, tiba-tiba memungkinkan segala jenis atribut, tidak ada cara umum yang mungkin untuk menghasilkan daftar itu. Thedir
mengembalikan fungsi kunci dalam__dict__
atribut, yaitu semua atribut diakses jika__getattr__
metode tidak reimplemented.Untuk pertanyaan kedua, itu tidak masuk akal. Sebenarnya, metode adalah atribut yang bisa dipanggil, tidak lebih. Anda dapat memfilter atribut callable, dan, menggunakan
inspect
modul menentukan metode kelas, metode atau fungsi.sumber
Itu sebabnya
__dir__()
metode baru telah ditambahkan dalam python 2.6Lihat:
sumber
__dir
__ () adalah metode pada objek, bukan fungsi - harap baca tautan dalam jawaban dan inipprint({k:getattr(ojb,k) for k in obj.__dir__()})
Berikut ini adalah tambahan praktis untuk jawaban PierreBdR dan Moe:
dir()
tampaknya sudah cukup.Untuk kelas gaya lama , kita setidaknya bisa melakukan apa yang modul standar lakukan untuk mendukung penyelesaian tab: selain itu
dir()
, cari__class__
, lalu lanjutkan untuk__bases__
:(Kode uji dan output dihapus untuk singkatnya, tetapi pada dasarnya untuk objek gaya baru kita tampaknya memiliki hasil yang sama
get_object_attrs()
seperti untukdir()
, dan untuk kelas gaya lama tambahan utama padadir()
output tampaknya menjadi__class__
atribut.)sumber
Hanya untuk melengkapi:
dir()
adalah alat yang paling kuat / mendasar. ( Paling direkomendasikan )Solusi selain
dir()
hanya menyediakan cara mereka menangani keluarandir()
.Mendaftar atribut level 2 atau tidak, penting untuk melakukan penyaringan sendiri, karena kadang-kadang Anda mungkin ingin menyaring vars internal dengan garis bawah utama
__
, tetapi kadang-kadang Anda mungkin perlu__doc__
doc-string.__dir__()
dandir()
mengembalikan konten yang identik.__dict__
dandir()
berbeda.__dict__
mengembalikan konten yang tidak lengkap.PENTING :
__dir__()
terkadang dapat ditimpa dengan fungsi, nilai atau tipe, oleh penulis untuk tujuan apa pun.Berikut ini sebuah contoh:
TypeError: descriptor
__dir__
dari'object'
objek membutuhkan argumenPenulis PyTorch memodifikasi
__dir__()
metode menjadi sesuatu yang membutuhkan argumen. Modifikasi ini membuatdir()
gagal.Jika Anda ingin skema yang dapat diandalkan untuk melintasi semua atribut dari suatu objek, ingatlah bahwa setiap standar pythonic dapat ditimpa dan mungkin tidak berlaku , dan setiap konvensi mungkin tidak dapat diandalkan.
sumber
Ini adalah cara saya melakukannya, berguna untuk objek kustom sederhana yang Anda tambahkan atribut:
Diberikan objek yang dibuat dengan
obj = type("Obj",(object,),{})
, atau hanya dengan:Tambahkan beberapa atribut:
lalu, untuk mendapatkan kamus dengan hanya atribut khusus:
sumber