Apa perbedaan antara modul Python dan paket Python?
Lihat juga: Apa perbedaan antara "paket" dan "modul" (untuk bahasa lain)
__init__.py
file.
from plumbum.cmd import ls
implementasi
__init__.py
Apa perbedaan antara modul Python dan paket Python?
Lihat juga: Apa perbedaan antara "paket" dan "modul" (untuk bahasa lain)
__init__.py
file.
from plumbum.cmd import ls
implementasi
__init__.py
Jawaban:
Modul adalah file tunggal (atau file) yang diimpor dengan satu impor dan digunakan. misalnya
import my_module
Paket adalah kumpulan modul dalam direktori yang memberikan hierarki paket.
from my_package.timing.danger.internets import function_of_love
__path__
atribut.
__init__.py
file. Mereka adalah modul yang dapat berisi modul lain.
__path__
atribut.
File Python adalah modul , namanya menjadi nama dasar file tanpa .py
ekstensi. Sebuah paket adalah kumpulan dari modul Python: sementara modul adalah file Python tunggal, sebuah paket adalah direktori modul Python yang berisi tambahan __init__.py
file, untuk membedakan sebuah paket dari sebuah direktori yang kebetulan mengandung banyak skrip Python. Paket dapat disarangkan ke kedalaman apa saja, asalkan direktori terkait berisi __init__.py
file mereka sendiri .
Perbedaan antara modul dan paket tampaknya hanya pada tingkat sistem file. Saat Anda mengimpor modul atau paket, objek terkait yang dibuat oleh Python selalu bertipe module
. Catatan, bagaimanapun, ketika Anda mengimpor paket, hanya variabel / fungsi / kelas dalam __init__.py
file paket yang langsung terlihat, bukan sub-paket atau modul. Sebagai contoh, pertimbangkan xml
paket di pustaka standar Python: xml
direktori -nya berisi __init__.py
file dan empat sub-direktori; sub-direktori etree
berisi __init__.py
file dan, antara lain, ElementTree.py
file. Lihat apa yang terjadi ketika Anda mencoba mengimpor paket / modul secara interaktif:
>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
Dalam Python ada juga modul built-in, seperti sys
, yang ditulis dalam C, tapi saya tidak berpikir Anda bermaksud mempertimbangkan mereka dalam pertanyaan Anda.
module
. Saya sedang dalam proses menulis debugger dan khawatir bahwa debugger saya salah dalam mengatakan bahwa paket saya adalah module
s.
import
pernyataan biasa , karena tanda hubung tidak diperbolehkan dalam pengidentifikasi Python. Gunakan importlib.import_module()
sebagai gantinya.
Dari daftar istilah Python :
Penting untuk diingat bahwa semua paket adalah modul, tetapi tidak semua modul adalah paket. Atau dengan kata lain, paket hanyalah jenis modul khusus. Khususnya, modul apa pun yang berisi
__path__
atribut dianggap sebagai paket.
File Python dengan tanda hubung dalam nama, seperti my-file.py
, tidak dapat diimpor dengan import
pernyataan sederhana . Dari sisi kode, import my-file
sama dengan import my - file
yang akan memunculkan eksepsi. File-file seperti itu lebih baik ditandai sebagai skrip sedangkan file yang dapat diimpor adalah modul .
Pertama, perlu diingat bahwa, dalam definisi yang tepat, modul adalah objek dalam memori juru bahasa Python, sering dibuat dengan membaca satu atau lebih file dari disk. Meskipun kami secara informal dapat memanggil file disk seperti a/b/c.py
"modul," itu tidak benar-benar menjadi satu sampai dikombinasikan dengan informasi dari beberapa sumber lain (seperti sys.path
) untuk membuat objek modul.
(Perhatikan, misalnya, bahwa dua modul dengan nama berbeda dapat diambil dari file yang sama, tergantung pada sys.path
dan pengaturan lainnya. Inilah yang terjadi dengan python -m my.module
diikuti oleh import my.module
penerjemah; akan ada dua objek modul, __main__
dan my.module
, keduanya dibuat dari file yang sama pada disk my/module.py
,.)
Sebuah paket adalah modul yang mungkin memiliki submodul (termasuk subpackages). Tidak semua modul dapat melakukan ini. Sebagai contoh, buat hierarki modul kecil:
$ mkdir -p a/b
$ touch a/b/c.py
Pastikan tidak ada file lain di bawah a
. Mulai juru bahasa Python 3.4 atau yang lebih baru (mis. Dengan python3 -i
) dan periksa hasil dari pernyataan berikut:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
Modul a
dan a.b
paket (pada kenyataannya, jenis paket tertentu disebut "paket namespace," meskipun kami tidak khawatir tentang itu di sini). Namun, modul a.b.c
bukan paket. Kami dapat menunjukkan ini dengan menambahkan file lain, a/b.py
ke struktur direktori di atas dan memulai juru bahasa baru:
import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ⇒ <module 'a' (namespace)>
a.__path__ ⇒ _NamespacePath(['/.../a'])
a.b ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'
Python memastikan bahwa semua modul induk dimuat sebelum modul anak dimuat. Di atasnya ditemukan bahwa itu a/
adalah direktori, dan menciptakan paket namespace a
, dan itu a/b.py
adalah file sumber Python yang dimuat dan digunakan untuk membuat modul (non-paket) a.b
. Pada titik ini Anda tidak dapat memiliki modul a.b.c
karena a.b
bukan paket, dan dengan demikian tidak dapat memiliki submodula.
Anda juga dapat melihat di sini bahwa modul paket a
memiliki __path__
atribut (paket harus memiliki ini) tetapi modul non-paket a.b
tidak.
Jawaban yang terlambat, definisi lain:
Paket diwakili oleh entitas teratas yang diimpor yang bisa berupa modul mandiri, atau
__init__.py
modul khusus sebagai entitas teratas dari satu set modul dalam struktur sub direktori.
Jadi secara fisik paket adalah unit distribusi, yang menyediakan satu atau lebih modul.
__init__.py
modul di dalamnya, namun jika Anda berbicara tentang unit distribusi (umumnya melalui PyPI) maka ini adalah jenis paket lain seluruhnya (biasanya ditentukan oleh keberadaan setup.py
). Saya menemukan dua penggunaan istilah ini package
membingungkan, dan saya telah berbicara dengan beberapa pemula Python yang merasa sangat membingungkan.