2015-07-05 12 views
5

Gần đây tôi đã thực hiện chuyển đổi từ python 2 sang python 3. Python 3 documentation lần đọc: "Đã xóa tải lại(). Sử dụng imp.reload()" Nó thực sự không nói lý do tại sao.Tại sao tải lại bị xóa khỏi nội trang python trong chuyển sang python3?

This câu hỏi mô tả cách nó được thực hiện bây giờ trong python 3. Có ai có bất kỳ ý tưởng tại sao nó được lấy ra từ built-in và bây giờ đòi hỏi imp hoặc importlib để tải lại? Khi thử nghiệm một chương trình khi bạn xây dựng nó bằng cách sử dụng dấu nhắc tương tác, việc tải lại ngay tại đó theo mặc định là siêu thuận tiện. Rõ ràng tôi có thể lấy lại điều đó bằng cách thực hiện một cái gì đó như

from imp import reload 

Nó chỉ là một dòng mã khác mỗi khi tôi mở một dấu nhắc tương tác để kiểm tra mã. Lý do đằng sau sự thay đổi này là gì?

+0

Nó phải ít phổ biến hơn hoặc quan trọng đối với các bản dựng sẵn còn lại. Tiện dụng trong một bối cảnh thực thi cụ thể không thay đổi điều này. – user2864740

+2

Tôi nghĩ rằng đó là bởi vì có quá nhiều người nhìn thấy nó ngồi đó trong nội trang và sử dụng nó mà không hiểu những hạn chế của nó. Đặt nó vào một mô-đun khiến ít khả năng mọi người sẽ sử dụng nó mà không biết họ đang làm gì. Tôi không thể tìm thấy một nguồn đáng tin cậy cho thông tin này mặc dù. – BrenBarn

Trả lời

3

reload() đã bị xóa khỏi phần tích hợp làm một trong Bí quyết Python Guido được thể hiện trong Keynote address at OSCON 2002 (trang trình bày 6). Xem PEP 3100 - Miscellaneous Python 3.0 Plans có tên một số thay đổi theo dõi nguồn gốc của chúng đối với cuộc trò chuyện đó.

Từ trang trình bày, tôi muốn nói rằng anh ta dự kiến ​​exec() sẽ được sử dụng; mà chắc chắn sẽ bao gồm các usecase phổ biến nhất của iteratively phát triển một số mã trong một trình soạn thảo và tái kiểm tra nó trong một thông dịch viên tương tác.

Tuy nhiên, khi thảo luận về PEP 3121 - Extension Module Initialization and Finalization Guido nhanh chóng phát hiện ra rằng ông đã bỏ lỡ chức năng:

Có; Tôi không chắc chắn liệu mô-đun tải lại tiếp tục được hỗ trợ trong Py3k hay không. Nếu không, nó phải được loại bỏ khỏi PEP, nếu có, nó phải được chỉ định.

Tôi đã bỏ tích lũy lại() nội trang, vì vậy tôi nghĩ cần giữ xung quanh dưới một số hình thức. Tôi mong đợi một số chức năng tải lại sẽ vẫn có sẵn, có lẽ ở đâu đó trong mô-đun imp.

Vì vậy, trong ngắn hạn, reload() đã được loại bỏ trước, sau đó khi nó bị nhỡ, imp.reload() đã được thêm vào. Nó không thực sự cần phải được xây dựng trong anyway, tôi chắc chắn sử dụng nó chỉ hiếm khi.

Trong Python 3.4 the function was moved đến importlib.reload().

+1

Lưu ý rằng 'reload' đã được chuyển gần đây (http://bugs.python.org/issue18193) thành' importlib', vì vậy nếu bạn đang viết mã mới, hãy sử dụng 'importlib.reload' trực tiếp vào tránh các vấn đề sau này khi chức năng cuối cùng trở nên không được chính thức ngừng sử dụng và sau đó bị xóa. – poke

Các vấn đề liên quan