Modul reload yang memberi NameError: nama 'reload' tidak ditentukan

162

Saya mencoba memuat ulang modul yang sudah saya impor di Python 3. Saya tahu Anda hanya perlu mengimpor sekali dan menjalankan importperintah lagi tidak akan melakukan apa-apa.

Eksekusi reload(foo)memberikan kesalahan ini:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

Apa artinya kesalahan itu?

Harga Lonnie
sumber

Jawaban:

239

reload adalah builtin di Python 2, tetapi tidak di Python 3, jadi kesalahan yang Anda lihat diharapkan.

Jika Anda benar-benar harus memuat ulang modul dengan Python 3, Anda harus menggunakan:

Alex Martelli
sumber
37
Jawaban ini membuatnya terdengar seperti buruk untuk memuat ulang modul dengan Python 3. Apa pemikiran di balik ini?
ABM
11
Muat ulang selalu bermasalah. Memuat ulang variabel modul pembaruan, tetapi tidak menghapus yang lama, jadi jika Anda mengganti nama sesuatu nama lama akan tetap ada. Jika Anda mengubah definisi kelas, objek yang ada masih akan memiliki tipe lama. Akhirnya, beberapa modul menjalankan kode pada waktu impor yang tidak dirancang untuk berjalan dua kali. Jadi lebih baik menghindari reload, tetapi seringkali sangat nyaman.
Evan
13
Saya akan mengatakan bahwa itu sering bermasalah, tetapi tidak selalu . Yang pasti, saya pikir kasus penggunaan yang valid untuk menulis reloadmenjadi skrip memang sangat jarang, dan mereka yang menggunakan seni gelap semacam itu tidak mungkin membaca komentar ini. Namun, jika Anda sedang mengembangkan modul dan menggunakan konsol IPython untuk mengujinya secara interaktif, maka reloadbisa berguna dalam alur kerja itu. Seperti yang dikatakan @Evan, hati-hati terhadap efek samping waktu impor. Secara umum, saya akan mengatakan untuk menghindari reloadmodul orang lain. reloadAnda sendiri masuk akal selama waktu desain.
Tim D
6
Saya menggunakan notebook Jupyter untuk pekerjaan saya, dan untuk menjaga hal-hal tetap rapi, saya menempatkan pekerjaan yang harus memerlukan revisi minimum ke dalam paket impor. Namun, hal-hal itu terkadang perlu direvisi, dan memuat ulang benar-benar hal yang benar untuk dilakukan, karena kernel notebook saya memegang perhitungan memori yang, secara harfiah, sepanjang hari dihitung.
Scott
Reload sangat penting untuk pengembangan perpustakaan yang aktif dengan panggilan yang memakan waktu misalnya fungsi Database. Namun, salah satu masalah utama yang dapat Anda temui dalam memuat ulang modul adalah bahwa fungsi dengan dekorator cenderung tidak memuat dengan benar lihat di sini
Alexander McFarlane
82

Untuk> = Python3.4:

import importlib
importlib.reload(module)

Untuk <= Python3.3:

import imp
imp.reload(module)

Untuk Python2.x:

Gunakan reload()fungsi bawaan .

reload(module)
Kevin
sumber
48
import imp
imp.reload(script4)

sumber
7
Tidak digunakan lagi sejak Python 3.4 - gunakan importlibsaja.
Mark Amery
39

Untuk memperluas jawaban yang ditulis sebelumnya, jika Anda menginginkan solusi tunggal yang akan bekerja di seluruh versi Python 2 dan 3, Anda dapat menggunakan yang berikut:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
Joey Wilhelm
sumber
12

Saya sarankan menggunakan cuplikan berikut ini karena berfungsi di semua versi python (membutuhkan six):

from six.moves import reload_module
reload_module(module)
Alleo
sumber
2

Untuk kompatibilitas python2 dan python3, Anda dapat menggunakan:

# Python 2 and 3
from imp import reload
reload(mymodule)
Patrick José Pereira
sumber
1
Ini berfungsi dalam Python 3.7 (dan sebelumnya), tetapi dihapus seperti @Alex Martelli menulis di bawah ini. Gunakan jawaban Alleo 'dari six.moves import reload_module'
Charles Plager
2

Jika Anda tidak ingin menggunakan lib eksternal, maka salah satu solusinya adalah membuat ulang metode reload dari python 2 untuk python 3 seperti di bawah ini. Gunakan ini di bagian atas modul (mengasumsikan python 3.4+).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

Reload BTW sangat diperlukan jika Anda menggunakan file python sebagai file konfigurasi dan ingin menghindari restart aplikasi .....

pengguna6830669
sumber