2012-02-15 38 views

Trả lời

12

Nhập mô-đun hoặc gói bằng Python là một hoạt động khái niệm đơn giản:

  1. Tìm file py tương ứng với việc nhập khẩu. Điều này liên quan đến đường dẫn Python và một số máy móc khác, nhưng sẽ dẫn đến một tệp .py cụ thể được tìm thấy.

  2. Đối với mọi cấp thư mục trong quá trình nhập (import foo.bar.baz có hai cấp độ), hãy tìm tệp __init__.py tương ứng và thực thi nó. Thực thi nó đơn giản có nghĩa là chạy tất cả các câu lệnh mức cao nhất trong tệp.

  3. Cuối cùng, chính tệp .py (foo/bar/baz.py trong trường hợp này) được thực hiện, nghĩa là tất cả các câu lệnh cấp cao nhất được thực hiện. Tất cả các globals được tạo ra như là kết quả của việc thực thi đó được gộp vào một đối tượng mô-đun, và đối tượng mô-đun đó là kết quả của việc nhập khẩu.

Nếu không có bước nào trong số các gói con này được nhập, thì các gói con đó không có sẵn. Nếu họ đã nhập các gói con, thì chúng có sẵn. Tác giả gói có thể làm như họ muốn.

+0

Tôi nghĩ rằng nó có giá trị làm rõ rằng khi nhập một gói, tệp .py được tìm thấy trong bước 1 là \ _ \ _ init \ _ \ _. Py cho gói. Trừ khi các gói con được nhập vào tệp tin \ _ \ _ init \ _ \ _ py đó, chúng sẽ không có sẵn. –

1

Điều này chỉ cho phép số lượng mã tối thiểu phải được tải cho các thư viện nhiều phần mà bạn không thể sử dụng toàn bộ. Ví dụ: bạn có thể không sử dụng phần html của lxml và do đó không muốn phải xử lý việc tải mã của nó.

2

lxml là một gói chứ không phải mô-đun. Một gói là một tập hợp các mô-đun. Khi điều đó xảy ra, bạn cũng có thể nhập trực tiếp gói, nhưng điều đó không tự động nhập tất cả các mô-đun con của nó.

lý do tại sao đây là, tốt, đó là một câu hỏi cho BDFL. Tôi nghĩ rằng nó có thể là vì các gói nói chung là khá lớn, và nhập khẩu tất cả các mô-đun con sẽ là một hình phạt hiệu suất quá mức.

6

lxml được gọi là package bằng Python, đây là bộ sưu tập mô-đun cực kỳ. Các gói có thể rất lớn, vì vậy chúng được phép chọn lọc về những gì được kéo vào khi chúng được nhập. Nếu không, mọi người sẽ phải nhập toàn bộ hệ thống phân cấp, điều này sẽ lãng phí tài nguyên.

4

Đó là theo thiết kế. Gói này có tùy chọn để nhập gói lồng nhau trong __init__.py của nó, sau đó, bạn sẽ có thể truy cập gói lồng nhau mà không gặp sự cố. Đó là vấn đề lựa chọn cho người viết gói và mục đích là giảm thiểu số lượng mã mà bạn có thể sẽ không sử dụng.

Các vấn đề liên quan