Hãy tưởng tượng bạn có mã này trong python:
foo = MyObject()
fo.bar()
Rõ ràng, chúng ta đã có một lỗi đánh máy và fo
nên có foo
. Ngay bây giờ trăn nói:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fo' is not defined
Nhưng với lớp tải ngầm, nó có thể nói:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named fo
đó sẽ là khó hiểu. Tệ hơn nữa, nếu bạn viết sai một tên biến chỉ là tên của một mô-đun, bạn sẽ nhận được một lỗi thậm chí còn khó hiểu hơn khi bạn cố gắng xử lý mô-đun đó như thể đó là biến của bạn. Python không thể biết liệu thứ gì đó là tên lớp, đối tượng hay bất cứ thứ gì.
Mặt khác, Java, tôi tin rằng có thể nói từ cú pháp cho dù một định danh nhất định đề cập đến một lớp hay cái gì khác. Do đó, nó không có vấn đề với việc tạo ra một thông báo lỗi thích hợp.
Nhìn chung, nó phù hợp với triết lý Python là rõ ràng hơn là ẩn. Họ nghĩ rằng tốt hơn là nhập một mô-đun thay vì nhập tự động. Vấn đề thông báo lỗi là yếu tố đóng vai trò quyết định.
Một số người đã gợi ý rằng sẽ có một chi phí thời gian chạy lớn để ẩn nhập khẩu. Tôi không nghĩ vậy. Điều gì xảy ra là một cái gì đó như thế này:
- Mã op LOAD_GLOBAL được gọi với tên "foo"
- từ điển toàn cầu đã kiểm tra "foo"
- từ điển nội dung được kiểm tra cho "foo"
- Nếu tìm thấy foo, lưu trữ trên toàn cầu và tiếp tục
- Nếu không tìm thấy foo, hãy nâng cao NameError
Để hỗ trợ tải mô-đun ngầm, chúng tôi có thể làm:
- Mã op LOAD_GLOBAL được gọi với tên "foo"
- từ điển toàn cầu đã kiểm tra "foo"
- từ điển nội dung được kiểm tra cho "foo"
- Nếu thất bại ở trên, hãy thử
import foo
- Nếu tìm thấy foo, lưu trữ trên toàn cầu và tiếp tục
- Nếu không tìm thấy foo, hãy nâng cao NameError
Lần đầu tiên mô-đun được sử dụng, sẽ mất nhiều thời gian hơn vì trước tiên nó phải tìm kiếm thông qua các từ điển khác. Nhưng đó chỉ là lần đầu tiên và không nên có ý nghĩa về toàn bộ thời gian chạy chương trình.
Sẽ có một chi phí đáng kể, trong trường hợp tên biến sai chính tả. Khi chúng xuất hiện, python sẽ lãng phí thời gian đọc đĩa cố gắng tìm mô-đun. Nhưng nếu điều đó xảy ra, chương trình của bạn sắp chết với dù sao đi nữa và hiệu suất không phải là một mối quan tâm lớn.