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?

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:


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)

48
import imp
imp.reload(script4)

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

12

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

from six.moves import reload_module
reload_module(module)

2

Untuk kompatibilitas python2 dan python3, Anda dapat menggunakan:

# Python 2 and 3
from imp import reload
reload(mymodule)

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 .....

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.