Saya menggunakan Python 3.5.1. Saya membaca dokumen dan bagian paket di sini: https://docs.python.org/3/tutorial/modules.html#packages
Sekarang, saya memiliki struktur berikut:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
Sekarang, saat berada di /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Demikian pula, sekarang di rumah, superfolder dari Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Sebenarnya, saya bisa melakukan segala macam hal:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Mengapa ini bekerja? Saya __init__.py
pikir perlu ada file (yang kosong akan bekerja) di keduanya a
dan b
untuk module.py
dapat diimpor ketika jalur Python menunjuk ke Playground
folder?
Ini tampaknya telah berubah dari Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Dengan __init__.py
keduanya ~/Playground/a
dan ~/Playground/a/b
itu berfungsi dengan baik.
sumber
Zen Of Python
baris 2:Explicit is better than implicit.
....__init__.py
, kadang tidak. Dalam Python 3 ketika saya membutuhkan barang-barang ini saya membuat yang baru__init__.py
dengan kode spesifik, kalau tidak saya tidak. Ini berguna untuk mengetahui, secara visual, paket mana yang memiliki init khusus. Alih-alih dalam python 2 saya selalu harus menempatkan__init__.py
(sering kosong), membuat banyak dari mereka dan akhirnya lebih sulit untuk mengingat di mana Anda menempatkan kode init Anda. Ini juga harus sesuai "Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya.".PENTING
@ Mike jawaban sudah benar tetapi juga tidak tepat. Memang benar bahwa Python 3.3+ mendukung Paket Namespace Implisit yang memungkinkannya untuk membuat paket tanpa
__init__.py
file.Namun ini, HANYA berlaku untuk file KOSONG
__init__.py
. Jadi file KOSONG__init__.py
tidak lagi diperlukan dan dapat dihilangkan. Jika Anda ingin menjalankan skrip inisialisasi tertentu ketika paket atau modul atau sub-paketnya diimpor, Anda masih memerlukan__init__.py
file. Ini adalah jawaban Stack Overflow yang bagus untuk mengapa Anda ingin menggunakan__init__.py
file untuk melakukan inisialisasi lebih lanjut jika Anda bertanya-tanya mengapa ini berguna.Contoh Struktur Direktori:
parent_package/child_package/__init__.py
:CONTOH
Contoh di bawah ini menunjukkan bagaimana skrip inisialisasi dijalankan ketika
child_package
atau salah satu modulnya diimpor.Contoh 1 :
Contoh 2 :
sumber
run_script.py
dir yang samaparent_package
sehingga saya bisa mengimpor sepertifrom parent_package.child_package import child1
tanpa__init__.py
?child1.py
,child2.py
alih-alih hanya menempatkan kode mereka ke dalam__init__
.py secara langsung.__init__
impor relatiffrom . import child1
? Impor absolut memberi sayaModuleNotFoundError
(dalam Python 3.6)__init__.py
kadang-kadang masih diperlukan yang kosong , seperti ketika Anda ingin merujuk subfolder sebagai sebuah paket. Misalnya, jika saya menjalankannyapython -m test.foo
tidak berfungsi sampai saya membuat kosong di__init__.py
bawah folder tes. Dan saya berbicara tentang versi 3.6.6 di sini!Jika Anda memiliki
setup.py
dalam proyek Anda dan Anda menggunakannyafind_packages()
di dalamnya, perlu memiliki__init__.py
file di setiap direktori untuk paket yang akan ditemukan secara otomatis.UPD : Jika Anda ingin menggunakan paket namespace implisit tanpa
__init__.py
Anda hanya perlu menggunakanfind_namespace_packages()
gantinyaDocuments
sumber
Saya akan mengatakan bahwa seseorang harus menghilangkan
__init__.py
satu - satunya jika seseorang ingin memiliki paket namespace implisit . Jika Anda tidak tahu apa artinya, Anda mungkin tidak menginginkannya dan oleh karena itu Anda harus terus menggunakan__init__.py
bahkan dalam Python 3.sumber