Nó phụ thuộc vào những gì phiên bản của Python bạn đang sử dụng. Nếu phiên bản Python được nhắm mục tiêu của bạn là 2.4 hoặc cũ hơn (vào năm 2015, tôi chắc chắn hy vọng không), thì có nó sẽ là thực hành xấu vì không có cách nào (không có hack) để phân biệt hai mô-đun.
Tuy nhiên, trong Python 2.5+, tôi nghĩ rằng việc sử dụng lại tên mô-đun lib chuẩn trong không gian tên gói là hoàn toàn tốt; trên thực tế, đó là the spirit of PEP328.
Khi thư viện của Python mở rộng, ngày càng nhiều mô-đun nội bộ gói hiện đột nhiên ẩn mô-đun thư viện chuẩn. Đó là một vấn đề đặc biệt khó khăn bên trong các gói vì không có cách nào để xác định mô-đun nào có nghĩa là. Để giải quyết sự mơ hồ, nó được đề xuất rằng foo sẽ luôn là một mô-đun hoặc gói có thể truy cập từ sys.path. Đây được gọi là nhập khẩu tuyệt đối.
Cộng đồng python-dev đã chọn nhập khẩu tuyệt đối làm mặc định vì chúng là trường hợp sử dụng phổ biến hơn và vì nhập khẩu tuyệt đối có thể cung cấp tất cả chức năng nhập khẩu tương đối (trong gói) - mặc dù chi phí khó khăn đổi tên các phần của gói cao hơn trong hệ thống phân cấp hoặc khi di chuyển một gói bên trong một gói khác.
Bởi vì điều này thể hiện một sự thay đổi trong ngữ nghĩa, nhập khẩu tuyệt đối sẽ không bắt buộc bằng Python 2.5 và 2.6 thông qua việc sử dụng các from __future__ import absolute_import
SWS.time
rõ ràng là không điều tương tự như time
và như một độc giả của các mã, tôi mong đợi SWS.time
để không chỉ sử dụng time
, nhưng để mở rộng nó theo một cách nào đó.
Vì vậy, nếu SWS.foo
nhu cầu nhập khẩu SWS.time
, sau đó nó phải sử dụng đường dẫn tuyệt đối:
# in SWS.foo
# I would suggest renaming *within*
# modules that use SWS.time so that
# readers of your code aren't confused
# with which time module you're using
from SWS import time as sws_time
Hoặc, nó nên sử dụng một rõ ràng nhập khẩu tương đối như trong câu trả lời Bakuriu của:
# in SWS.foo
from . import time as sws_time
Trong trường hợp bạn cần nhập khẩu mô-đun lib chuẩn time
trong mô-đun SWS.time
, trước tiên bạn sẽ cần nhập tính năng trong tương lai (chỉ dành cho Python 2.5+; Python 3+ thực hiện điều này theo mặc định):
# inside of SWS.time
from __future__ import absolute_import
import time
time.sleep(28800) # time for bed
Lưu ý:from __future__ import absolute_imports
sẽ chỉ ảnh hưởng đến báo cáo nhập khẩu trong module rằng tính năng tương lai được nhập khẩu và sẽ không ảnh hưởng đến bất kỳ thành phần khác (như rằng sẽ bất lợi nếu mô-đun khác phụ thuộc vào nhập khẩu tương đối).
Tôi nghĩ rõ ràng là bạn không nên sử dụng lại tên mô-đun python chuẩn. Nó chỉ yêu cầu rắc rối. – Cryptite
Tại sao nó rõ ràng? devilsadvocate> – MikeWyatt
Nhìn vào httplib/httplib2 và urllib/urllib2. Nó làm cho một thế giới xấu xí của thư viện, nhưng đó là thích hợp hơn để đặt tên va chạm và hành vi không xác định. –