Page 52 - Python Simple
P. 52
6. Mô-đun http://www.vithon.org/tutorial/2.5/node8.html
gói, chẳng hạn như một hàm, lớp, hoặc biến. Câu lệnh import trước hết kiểm
tra xem item có được định nghĩa trong gói; nếu không, nó giả định rằng đó là
mô-đun và thử nạp nó. Nếu không thể tìm thấy mô-đun, biệt lệ ImportError sẽ
được nâng.
Ngược lại, khi dùng cú pháp như import item.subitem.subsubitem, mỗi tiểu mục trừ
tiểu mục cuối phải là một gói; tiểu mục cuối có thể là một mô-đun hoặc một gói
nhưng không thể là một lớp, hay hàm, hay biến được định nghĩa trong tiểu mục
trước.
6.4.1 Nhập * từ một gói
Bây giờ chuyện gì xảy ra khi bạn viết from Sound.Effects import *? Tốt
nhất, bạn sẽ hy vọng mã này sẽ tìm các mô-đun có trong gói và nhập tất cả
chúng vào. Đáng tiếc là tác vụ này không chạy ổn định lắm trên hệ Mac và
Windows vì hệ thống tập tin không luôn chứa thông tin chính xác về phân biệt
hoa/thường trong tên tập tin. Trên các hệ này, không có cách nào bảo đảm để
biết được nếu một tập tin ECHO.PY cần được nhập vào như là một mô-đun echo,
Echo hay ECHO. (Ví dụ, Windows 95 có một thói quen là hiện mọi tên tập tin với
ký tự đầu tiên viết hoa.) Hạn chế tên 8+3 của DOS cũng tạo ra thêm một vấn đề
thú vị với các tên mô-đun dài.
Giải pháp duy nhất là để tác giả gói chỉ định rõ chỉ mục của gói. Câu lệnh
import dùng cách thức sau: nếu mã __init__.py của gói có định nghĩa một danh
sách tên __all__, nó sẽ được dùng làm danh sách của các tên mô-đun cần
được nhập khi gặp from package import * . Tác giả gói sẽ phải tự cập nhật
danh sách này mỗi khi phiên bản mới của gói được phát hành. Tác giả gói cũng
có thể không hỗ trợ nó, nếu họ không thấy cách dùng importing * là hữu dụng
đối với gói của họ. Ví dụ, tập tin Sounds/Effects/__init__.py có thể chứa đoạn mã
sau:
__all__ = ["echo", "surround", "reverse"]
Điều này có nghĩa là from Sound.Effects import * sẽ nhập ba mô-đun được
chỉ định từ gói Sound .
Nếu __all__ không được định nghĩa, câu lệnh from Sound.Effects import *
does không nhập mọi mô-đun con từ gói Sound.Effects vào vùng tên hiện tại;
nó chỉ đảm bảo rằng gói Sound.Effects đã được nhập (có thể chạy các mã
khởi tạo trong __init__.py) và sau đó nhập các tên được định nghĩa trong gói.
Nó bao gồm các tên (và mô-đun con đã được nạp) được định nghĩa bởi
__init__.py. Nó cũng gồm các mô-đun con của gói đã được nạp bởi câu lệnh
import trước. Xem đoạn mã này:
import Sound.Effects.echo
import Sound.Effects.surround
from Sound.Effects import *
Trong ví dụ này, các mô-đun echo và surround được nhập vào vùng tên hiện
8 of 10 08/31/2011 10:26 AM