Paket saya memiliki struktur berikut:
mobilescouter/
__init__.py #1
mapper/
__init__.py #2
lxml/
__init__.py #3
vehiclemapper.py
vehiclefeaturemapper.py
vehiclefeaturesetmapper.py
...
basemapper.py
vehicle/
__init__.py #4
vehicle.py
vehiclefeature.py
vehiclefeaturemapper.py
...
Saya tidak yakin bagaimana __init__.py
file harus ditulis dengan benar.
The __init__.py #1
terlihat seperti:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
Tetapi bagaimana seharusnya misalnya __init__.py #2
terlihat seperti? Punya saya:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
Kapan sebaiknya __all__
digunakan?
Jawaban:
__all__
sangat baik - ini membantu memandu pernyataan impor tanpa secara otomatis mengimpor modul http://docs.python.org/tutorial/modules.html#importing-from-a-packagemenggunakan
__all__
danimport *
berlebihan, hanya__all__
diperlukanSaya pikir salah satu alasan paling kuat untuk digunakan
import *
dalam__init__.py
mengimpor paket adalah untuk dapat membuat ulang skrip yang telah berkembang menjadi banyak skrip tanpa merusak aplikasi yang ada. Tetapi jika Anda merancang paket dari awal. Saya pikir yang terbaik adalah membiarkan__init__.py
file kosong.sebagai contoh:
lalu aplikasi tumbuh dan sekarang menjadi seluruh folder
maka skrip init dapat mengatakan
sehingga skrip yang ditulis untuk melakukan hal berikut tidak rusak selama perubahan:
sumber
__all__
danimport *
redundan",__all__
digunakan oleh konsumen modul, danfrom foo import *
digunakan oleh modul itu sendiri untuk menggunakan yang lain ....using __all__ and import * is redundant, only __all__ is needed
Bagaimana itu berlebihan? Mereka melakukan hal yang berbeda.__init__.py
File saya sendiri kosong lebih sering daripada tidak. Secara khusus, saya tidak pernah memilikifrom blah import *
sebagai bagian dari__init__.py
- jika "mengimpor paket" berarti mendapatkan semua jenis kelas, fungsi dll yang didefinisikan langsung sebagai bagian dari paket, maka saya akan secara leksikal menyalin kontenblah.py
ke dalam paket__init__.py
sebagai gantinya dan menghapusblah.py
( perbanyakan file sumber tidak ada gunanya di sini).Jika Anda bersikeras mendukung
import *
idiom (eek), kemudian menggunakan__all__
(dengan sangat kecil daftar nama yang dapat Anda bawa sendiri) dapat membantu untuk pengendalian kerusakan. Secara umum, ruang nama dan impor eksplisit adalah hal yang baik , dan saya sangat menyarankan untuk mempertimbangkan kembali setiap pendekatan berdasarkan secara sistematis melewati salah satu atau kedua konsep! -)sumber
import *
Anda harus tanpa syarat menerima semua kerangka kerja dalam semua itu, bahkan fitur yang Anda tidak akan pernah gunakan. menjaga__init__.py
kosong memberi Anda lebih banyak peluang daripada hanya semantik semua atau tidak sama sekali. pikirkan tentang bengkok.from mobilescouter import A, B
hanya sebaris kode dan Anda tidak memiliki proyek dengan 666 kelas dan setiap orang dengan file sendiri, kan? jika Anda memiliki dua atau lebihimport *
kode Anda mengisi ruang nama dengan potensi sampah dan dengan cepat Anda akan lupa dari manaA
asalnya. Dan jika paket atas melakukan hal yang sama? Anda mengambil semua sub-paket dan sub-paket. seperti kata zen dari python, eksplisit lebih baik daripada implisit.Anda
__init__.py
harus memiliki docstring .Meskipun semua fungsi diimplementasikan dalam modul dan subpackages, paket dokumentasi Anda adalah tempat untuk mendokumentasikan tempat untuk memulai. Sebagai contoh, pertimbangkan paket python
email
. Dokumentasi paket adalah pengantar yang menjelaskan tujuan, latar belakang, dan bagaimana berbagai komponen dalam paket bekerja bersama. Jika Anda secara otomatis membuat dokumentasi dari dokumen menggunakan sphinx atau paket lain, paket dokumentasi tersebut adalah tempat yang tepat untuk menggambarkan pengantar tersebut.Untuk konten lain, lihat jawaban yang sangat bagus dari firecrow dan Alex Martelli .
sumber
__init__.py
untukemail
paket mengikuti panduan ini? Saya melihat satu baris docstring yang tidak banyak menjelaskan "bagaimana berbagai komponen dalam paket bekerja bersama".