NameError veren yeniden yükleme modülü: 'reload' adı tanımlanmadı


162

Ben zaten Python 3 ithal ettiğim bir modülü yeniden yüklemeye çalışıyorum. Sadece bir kez almak gerekir ve importkomutu tekrar yürütmek bir şey yapmaz biliyorum.

Yürütme reload(foo)şu hatayı veriyor:

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

Hata ne anlama geliyor?

Yanıtlar:


239

reload Python 2'de yerleşiktir, ancak Python 3'te değildir, bu nedenle gördüğünüz hata bekleniyor.

Python 3'te bir modülü gerçekten yeniden yüklemeniz gerekiyorsa, şunlardan birini kullanmalısınız:


37
Bu cevap, Python 3'te bir modülü yeniden yüklemek kötü gibi görünüyor. Bunun arkasındaki düşünce nedir?
ABM

11
Yeniden yükleme her zaman sorunludur. Yeniden yükleme modülü değişkenlerini günceller, ancak eskilerini kaldırmaz, bu nedenle bir şeyi yeniden adlandırırsanız eski ad yine de kalır. Sınıf tanımlarını değiştirirseniz, varolan nesneler hala eski türe sahip olur. Son olarak, bazı modüller iki kez çalışmak üzere tasarlanmayan kodları içe aktarma zamanında çalıştırır. Bu nedenle, yeniden yüklemekten kaçınmak daha iyidir, ancak genellikle çok uygundur.
Evan

13
Genellikle sorunlu olduğunu söyleyebilirim , ama her zaman değil . Emin olmak için, reloadbetiğe yazmak için geçerli kullanım durumlarının gerçekten çok nadir olduğunu ve bu tür karanlık sanatı kullananların bu yorumu okuma olasılığı düşüktür. Ancak, bir modül geliştiriyorsanız ve etkileşimli olarak test etmek için bir IPython konsolu kullanıyorsanız reload, o iş akışında kullanışlı olabilir. @Evan'ın dediği gibi, ithalat zamanı yan etkilerine dikkat edin. Genel olarak, bir reloadbaşkasının modüllerinden kaçınmayı söyleyebilirim . reloadkendi tasarım zamanlarınızda mantıklı.
Tim D

6
İşim için Jupyter not defterini kullanıyorum ve işleri düzenli tutmak için en az revizyon gerektiren işleri içe aktarılabilir paketlere koydum. Ancak, bu şeyler bazen revizyonlara ihtiyaç duyar ve yeniden yükleme yapmak kesinlikle doğru bir şeydir, çünkü dizüstü bilgisayar çekirdeğim, kelimenin tam anlamıyla tüm gün hesaplanması gereken bellek hesaplamalarını tutuyor.
Scott

Yeniden yükleme, zaman alıcı çağrıları olan kütüphanelerin aktif gelişimi için çok önemlidir, örneğin Veritabanı fonksiyonları. Ancak, yeniden yükleme modüllerinde karşılaşabileceğiniz ana sorunlardan biri, dekoratörler ile fonksiyonların düzgün bir şekilde yeniden yüklenmeme eğiliminde olmasıdır
Alexander McFarlane

82

> = Python3.4 için:

import importlib
importlib.reload(module)

<= Python3.3 için:

import imp
imp.reload(module)

Python2.x için:

Yerleşik reload()işlevi kullanın .

reload(module)

48
import imp
imp.reload(script4)

7
Python 3.4'ten bu yana kullanımdan kaldırıldı - importlibbunun yerine kullanın.
Mark Amery

39

Önceden yazılmış cevapları genişletmek için, Python sürüm 2 ve 3'te çalışacak tek bir çözüm istiyorsanız, aşağıdakileri kullanabilirsiniz:

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

Aşağıdaki kod parçasını tüm python sürümlerinde çalıştığı için kullanmanızı öneririm (gerektirir six):

from six.moves import reload_module
reload_module(module)

2

Python2 ve python3 uyumluluğu için şunları kullanabilirsiniz:

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

1
Bu, Python 3.7'de (ve daha önceki sürümlerde) çalışır, ancak @Alex Martelli'nin aşağıda yazdığı gibi gösterilmiştir. Alleo'nun cevabını 'six.moves import reload_module'den' kullanın
Charles Plager

2

Harici libs kullanmak istemiyorsanız, bir çözüm aşağıdaki gibi python 3 için python 2'den yeniden yükleme yöntemini yeniden oluşturmaktır. Bunu modülün üstünde kullanın (python 3.4+ olduğunu varsayar).

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

Yapı dosyaları olarak python dosyaları kullanıyorsanız ve uygulamanın yeniden başlatılmasını önlemek istiyorsanız BTW yeniden yükleme çok gereklidir .....

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.