Ở bất kỳ cấp độ từ vựng nào, from amodule import *
là một quyết định thiết kế có vẻ là một thảm họa thực tế trong cuộc sống thực. , Tôi không quá nóng trên nó - import module as m
chỉ buộc thêm hai ký tự để sử dụng tên đủ điều kiện thay vì [tiền tố m.
]], và tên đủ điều kiện luôn sắc nét và linh hoạt hơn tên thanh, chưa kể đến tính hữu ích trong các tình huống tương tác khám phá của việc có m
có sẵn cho help(m)
, reload(m)
và các loại tương tự!). Điều này làm cho nó rất khó khăn, cho người nghèo đọc mã (thường là trong một nỗ lực cam chịu để giúp gỡ lỗi nó) để hiểu nơi xuất hiện bí ẩn tên - không thể, nếu xây dựng được sử dụng nhiều hơn hơn một lần ở cấp độ từ vựng; nhưng ngay cả khi được sử dụng chỉ một lần, nó buộc phải đọc lại toàn bộ mô-đun mỗi lần trước khi người ta có thể thuyết phục bản thân rằng, yep, tên mã bị phân mảnh đó phải đến từ mô-đun.
Ngoài ra, tác giả mô-đun thường không gặp phải sự cố cực đoan cần thiết để "hỗ trợ" cấu trúc khủng khiếp được đề cập. Nếu bạn có mã nào đó trong mã của mình, ví dụ: sử dụng sys.argv
(và một số import sys
ở đầu mô-đun của bạn), làm cách nào để bạn biết rằng sys
là mô-đun cần ... hoặc một số hoàn toàn khác nhau (hoặc không phải là mô-đun) đến từ ... import *
?!Nhân với tất cả các tên đủ điều kiện bạn đang sử dụng, và đau khổ là kết quả cuối cùng duy nhất - đó, và các lỗi bí ẩn đòi hỏi gỡ lỗi lâu dài, mất thời gian (thường với sự giúp đỡ miễn cưỡng của ai đó nào "get" Python ... ! -).
Trong một hàm, cách thêm và ghi đè tên địa phương tùy ý sẽ còn tệ hơn nữa. Là một trình tối ưu hóa cơ bản nhưng rất quan trọng, trình biên dịch Python nhìn xung quanh phần tử của hàm cho bất kỳ phép gán hoặc các câu lệnh ràng buộc nào khác trên mỗi tên mã, và coi "local" (tên địa phương) mà nó thấy được gán (các tên khác phải là các globals hoặc built-ins). Với một import *
(giống như với exec somestring
mà không có dấu hiệu rõ ràng để sử dụng như không gian tên), đột nhiên nó trở thành một bí ẩn tổng thể tên địa phương, tên là toàn cầu - do đó trình biên dịch nghèo sẽ phải nghỉ mát đến chiến lược chậm nhất có thể cho mỗi tra cứu tên, sử dụng dict cho các biến cục bộ (thay vì "vector" nhỏ gọn mà nó thường sử dụng) và thực hiện tối đa ba lần xem trước cho từng tên mã được tham chiếu, lặp đi lặp lại.
Chuyển tới bất kỳ lời nhắc tương tác Python nào. Nhập import this
. Bạn thấy gì? Zen của Python. Cái gì cuối cùng và có lẽ là chút khôn ngoan nhất trong văn bản đó ...?
Không gian tên là một ý tưởng tuyệt vời đáng kinh ngạc - hãy làm nhiều hơn nữa!
By buộc việc sử dụng barenames nơi tên tiêu chuẩn là nên bao la thích hợp hơn, bạn đang chủ yếu làm điều ngược lại rất giới thiệu khôn ngoan này: thay vì ngưỡng mộ sự vĩ đại và honkingtude của không gian tên, và làm nhiều hơn trong số đó, bạn đang chia nhỏ hai không gian tên hoàn toàn tốt và sẵn sàng sử dụng (của mô-đun bạn đang nhập và phạm vi từ vựng bạn nhập vào) để tạo thành một đơn vị, không độc hại, buggy, chậm, cứng nhắc, không thể sử dụng mess.
Nếu tôi có thể quay trở lại và thay đổi một quyết định thiết kế đầu bằng Python (đó là một sự lựa chọn khó khăn, bởi vì việc sử dụng và đặc biệt là def
lambda
cho những gì Javascript rất nhiều readably hơn gọi function
là một đóng thứ hai ;-), Tôi sẽ xóa sạch ý tưởng import *
khỏi tâm trí của Guido. Không có số tiền bị cáo buộc tiện lợi cho việc khám phá tại dấu nhắc tương tác có thể cân bằng số lượng điều xấu mà nó bị ...!)
IDE nào bạn đang sử dụng để cảnh báo? – avi
Tôi đã viết một bài đăng blog giải thích tại sao điều này phải bị cấm ở phạm vi phi toàn cầu: https://www.lesinskis.com/TIL_python_imports.html – shuttle87