Mô-đun tải lại cho NameError: tên 'tải lại' không được xác định


162

Tôi đang cố tải lại một mô-đun mà tôi đã nhập trong Python 3. Tôi biết rằng bạn chỉ cần nhập một lần và thực hiện lại importlệnh sẽ không làm gì cả.

Thực hiện reload(foo)là đưa ra lỗi này:

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

Lỗi này có nghĩa là gì?

Câu trả lời:


239

reload là một phần mềm dựng sẵn trong Python 2, nhưng không phải trong Python 3, do đó, lỗi bạn gặp phải là có thể xảy ra.

Nếu bạn thực sự phải tải lại một mô-đun trong Python 3, bạn nên sử dụng một trong hai cách sau:


37
Câu trả lời này nghe có vẻ tệ khi tải lại một mô-đun trong Python 3. Bạn nghĩ gì đằng sau điều này?
ABM

11
Tải lại luôn có vấn đề. Tải lại các biến mô-đun cập nhật, nhưng không loại bỏ các biến cũ, vì vậy nếu bạn đổi tên một cái gì đó thì tên cũ vẫn tồn tại. Nếu bạn thay đổi định nghĩa lớp, các đối tượng hiện tại vẫn sẽ có kiểu cũ. Cuối cùng, một số mô-đun chạy mã tại thời điểm nhập không được thiết kế để chạy hai lần. Vì vậy, tốt hơn là tránh tải lại, nhưng thường rất thuận tiện.
Evan

13
Tôi sẽ nói rằng đó là thường có vấn đề, nhưng không phải lúc nào cũng vậy . Để chắc chắn, tôi nghĩ rằng các trường hợp sử dụng hợp lệ để viết reloadthành kịch bản thực sự rất hiếm, và những người sử dụng loại nghệ thuật bóng tối đó dường như không thể đọc được bình luận này. Tuy nhiên, nếu bạn đang phát triển một mô-đun và sử dụng bảng điều khiển IPython để kiểm tra nó một cách tương tác, thì reloadcó thể có ích trong quy trình làm việc đó. Như @Evan đã nói, mặc dù vậy, coi chừng các tác dụng phụ trong thời gian nhập khẩu. Nói chung, tôi sẽ nói để tránh reloading mô-đun của người khác. reloading của riêng bạn có ý nghĩa trong thời gian thiết kế.
Tim D

6
Tôi sử dụng máy tính xách tay Jupyter cho công việc của mình và để giữ mọi thứ gọn gàng, tôi đặt công việc cần yêu cầu sửa đổi tối thiểu vào các gói có thể nhập được. Tuy nhiên, những điều đó đôi khi cần sửa đổi và tải lại hoàn toàn là điều nên làm, vì nhân máy tính xách tay của tôi đang giữ các tính toán bộ nhớ, theo nghĩa đen, cả ngày để tính toán.
Scott

Tải lại là rất quan trọng đối với sự phát triển tích cực của các thư viện với các cuộc gọi tốn thời gian, ví dụ như các chức năng Cơ sở dữ liệu. Tuy nhiên, một trong những vấn đề chính bạn có thể gặp phải khi tải lại các mô-đun là các chức năng với trình trang trí sẽ có xu hướng không tải lại đúng cách xem tại đây
Alexander McFarlane

82

Cho> = Python3.4:

import importlib
importlib.reload(module)

Đối với <= Python3.3:

import imp
imp.reload(module)

Đối với Python2.x:

Sử dụng reload()chức năng được xây dựng .

reload(module)

48
import imp
imp.reload(script4)

7
Không dùng nữa vì Python 3.4 - sử dụng importlibthay thế.
Đánh dấu Amery

39

Để mở rộng các câu trả lời được viết trước đó, nếu bạn muốn một giải pháp duy nhất hoạt động trên các phiên bản Python 2 và 3, bạn có thể sử dụng như sau:

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

Tôi khuyên bạn nên sử dụng đoạn mã sau vì nó hoạt động trong tất cả các phiên bản python (yêu cầu six):

from six.moves import reload_module
reload_module(module)

2

Để tương thích với python2 và python3, bạn có thể sử dụng:

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

1
Điều này hoạt động trong Python 3.7 (và trước đó), nhưng được mô tả như @Alex Martelli đã viết dưới đây. Sử dụng câu trả lời của Alleo 'từ six.move nhập reload_module'
Charles Plager

2

Nếu bạn không muốn sử dụng lib bên ngoài, thì một giải pháp là tạo lại phương thức tải lại từ python 2 cho python 3 như dưới đây. Sử dụng phần này trong phần đầu của mô-đun (giả sử python 3,4+).

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

Tải lại BTW là rất cần thiết nếu bạn sử dụng tệp python làm tệp cấu hình và muốn tránh khởi động lại ứng dụng .....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.