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
   47   48   49   50   51   52   53   54   55   56   57