Saya tahu itu bisa dilakukan, tetapi saya tidak pernah ingat caranya.
Bagaimana Anda dapat mengimpor kembali modul dengan python? Skenarionya adalah sebagai berikut: Saya mengimpor modul secara interaktif dan mengotak-atiknya, tetapi kemudian saya menghadapi kesalahan. Saya memperbaiki kesalahan dalam file .py dan kemudian saya ingin mengembalikan modul tetap tanpa berhenti python. Bagaimana saya bisa melakukannya?
Jawaban:
Ini seharusnya bekerja:
Dari dokumen Python
Jika menjalankan Python 3.4 ke atas, lakukan
import importlib
, lalu lakukanimportlib.reload(nameOfModule)
.Jangan lupa peringatan menggunakan metode ini:
Ketika modul dimuat ulang, kamusnya (berisi variabel global modul) dipertahankan. Redefinisi nama akan menimpa definisi lama, jadi ini umumnya tidak menjadi masalah, tetapi jika versi baru modul tidak mendefinisikan nama yang ditentukan oleh versi lama, definisi lama tidak dihapus.
Jika modul mengimpor objek dari modul lain menggunakan
from ... import ...
, memanggilreload()
modul lain tidak mendefinisikan ulang objek yang diimpor darinya - salah satu cara untuk menyelesaikan ini adalah mengeksekusi ulangfrom
pernyataan, yang lain adalah dengan menggunakanimport
dan nama yang memenuhi syarat (module.*name*
) sebagai gantinya.Jika modul instantiates instance kelas, memuat ulang modul yang mendefinisikan kelas tidak mempengaruhi definisi metode dari instance - mereka terus menggunakan definisi kelas yang lama. Hal yang sama berlaku untuk kelas turunan.
sumber
from filename import *
. Bagaimana cara memuat ulang?import foo; from foo import bar; reload(foo)
Dalam python 3,
reload
tidak ada lagi fungsi bawaan.Jika Anda menggunakan python 3.4+ Anda harus menggunakan
reload
dariimportlib
perpustakaan sebagai gantinya:Jika Anda menggunakan python 3.2 atau 3.3, Anda harus:
sebagai gantinya. Lihat http://docs.python.org/3.0/library/imp.html#imp.reload
Jika Anda menggunakan
ipython
, pasti pertimbangkan untuk menggunakanautoreload
ekstensi:sumber
imp.reload
sudah ditinggalkan sejak Python 3.4, gunakanimportlib.reload
fungsi sebagai gantinya.from mymodule import myfunc
, makaimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
semua memberikan NameError.Sebenarnya, dalam Python 3 modul
imp
ditandai sebagai TERDEPAN. Ya, setidaknya itu berlaku untuk 3.4.Sebaliknya
reload
fungsi dariimportlib
modul harus digunakan:https://docs.python.org/3/library/importlib.html#importlib.reload
Namun ketahuilah bahwa perpustakaan ini memiliki beberapa perubahan API dengan dua versi minor terakhir.
sumber
Jika Anda ingin mengimpor fungsi atau kelas tertentu dari modul, Anda dapat melakukan ini:
sumber
Meskipun jawaban yang diberikan berfungsi untuk modul tertentu, mereka tidak akan memuat ulang submodul, seperti yang tercantum dalam jawaban ini :
Namun, jika menggunakan
__all__
variabel untuk mendefinisikan API publik, dimungkinkan untuk memuat ulang semua modul yang tersedia secara publik:Peringatan yang tercantum dalam jawaban sebelumnya masih valid. Khususnya, memodifikasi submodule yang bukan bagian dari API publik seperti yang dijelaskan oleh
__all__
variabel tidak akan terpengaruh oleh reload menggunakan fungsi ini. Demikian pula, menghapus elemen submodule tidak akan tercermin dengan memuat ulang.sumber