Python được tổ chức thành các mô-đun và gói. Một mô-đun là một tệp Python và một gói là một tập hợp các mô-đun. Xem xét ví dụ sau về nhập mô-đun
import random
random.randint[1,10]
from random import randint
randint[1,10]
8 là một mô-đun tích hợp sẵn của Python. Trong dòng đầu tiên, nó nhập mô-đun from random import randint
randint[1,10]
9 và làm cho nó có sẵn để sử dụng, sau đó nó truy cập vào import pandas
pandas.DataFrame[]
0. Nếu bạn mở một IDE và gỡ lỗi quá trình nhập, bạn sẽ thấy mã nằm trong tệp import pandas
pandas.DataFrame[]
1Bạn cũng có thể nhập
import pandas
pandas.DataFrame[]
2 như thế nàyfrom random import randint
randint[1,10]
Hãy xem một ví dụ từ một gói
import pandas
pandas.DataFrame[]
Thoạt nhìn, bạn thực sự không thể biết đó là mô-đun hay gói. Nhưng nếu bạn gỡ lỗi quá trình nhập, nó sẽ chuyển hướng bạn đến
import pandas
pandas.DataFrame[]
3 thay vì import pandas
pandas.DataFrame[]
4. Một gói chứa các mô-đun con hoặc đệ quy, các gói con và import pandas
pandas.DataFrame[]
5 là điểm vào của góiNhưng đó không phải là cách duy nhất, các chức năng như
import pandas
pandas.DataFrame[]
6 và import pandas
pandas.DataFrame[]
7 tích hợp cũng có thể được sử dụngfrom random import randint
randint[1,10]
3Bưu kiện. __trong đó__. py
Vậy
import pandas
pandas.DataFrame[]
5 là gì?Gói Python thông thường chứa tệp
import pandas
5. Khi gói được nhập, tệp
pandas.DataFrame[]import pandas
5 này được thực thi ngầm và các đối tượng mà nó xác định được liên kết với các tên trong không gian tên của gói. Tập tin này có thể để trống
pandas.DataFrame[]
Hãy xem một ví dụ. Tôi có một cấu trúc thư mục như thế này.
from random import randint
randint[1,10]
31 là gói của tôi và from random import randint
randint[1,10]
32 là mô hình conBên trong
from random import randint
randint[1,10]
33 , tôi có một biến from random import randint
randint[1,10]
34 mà tôi muốn sử dụng trong from random import randint
randint[1,10]
35. Tôi sẽ tạo một số phiên bản của import pandas
pandas.DataFrame[]
5 và xem nó ảnh hưởng như thế nào đến việc nhập vào from random import randint
randint[1,10]
35from random import randint
randint[1,10]
4Trường hợp 1. tập tin
from random import randint
randint[1,10]
38 trốngVì tệp
import pandas
pandas.DataFrame[]
5 trống khi chúng tôi nhập from random import randint
randint[1,10]
31 , không có mô-đun con nào được nhập, do đó, nó không biết sự tồn tại của from random import randint
randint[1,10]
32. Nếu chúng ta nhập from random import randint
randint[1,10]
32 một cách rõ ràng bằng cách sử dụng from random import randint
randint[1,10]
43 thì mọi thứ bên trong from random import randint
randint[1,10]
33 sẽ được nhập. Nhưng sau đó, chúng tôi không thực sự nhập gói mà nhập mô-đun. Như bạn có thể tưởng tượng, nếu gói của bạn có nhiều mô-đun con, bạn cần nhập từng mô-đun một cách rõ ràng, điều này có thể khá tẻ nhạtimport pandas
pandas.DataFrame[]
2Trường hợp2. nhập các mô hình con trong tệp
from random import randint
randint[1,10]
38Thay vì để trống, chúng tôi nhập mọi thứ từ
from random import randint
randint[1,10]
32 vào tệp import pandas
pandas.DataFrame[]
5. Sau đó, from random import randint
randint[1,10]
48 trong tệp from random import randint
randint[1,10]
35 sẽ nhận ra các biến trong from random import randint
randint[1,10]
33 và bạn có thể gọi trực tiếp import pandas
pandas.DataFrame[]
21 mà không cần biết nó đến từ mô-đun nàoimport pandas
pandas.DataFrame[]
0Bạn có thể đã nhận thấy dấu chấm trước khi
from random import randint
randint[1,10]
32. Đó là một lối tắt bảo nó tìm kiếm trong gói hiện tại. Đó là một ví dụ về nhập khẩu tương đối. Nhập tuyệt đối tương đương sẽ đặt tên rõ ràng cho gói hiện tại như import pandas
pandas.DataFrame[]
23Có một cảnh báo mặc dù. Nếu một mô hình con khác trong gói chứa cùng một biến, thì mô hình con được nhập sau sẽ ghi đè lên mô hình con trước đó
Ưu điểm của việc có một
import pandas
pandas.DataFrame[]
5 không trống là làm cho tất cả các mô hình con đã có sẵn cho máy khách khi họ nhập gói, vì vậy mã máy khách trông gọn gàng hơnPython tìm các mô-đun và gói như thế nào?
Hệ thống tìm kiếm các mô-đun và gói trong Python được gọi là Máy nhập khẩu, bao gồm các công cụ tìm, trình tải, bộ đệm và bộ điều phối
Máy móc nhập khẩu [Tạo bởi Xiaoxu Gao]
- Mô-đun tìm kiếm trong bộ đệm ẩn
import pandas
25
pandas.DataFrame[]
Mỗi khi bạn nhập một mô-đun, điều đầu tiên được tìm kiếm là từ điển
import pandas
pandas.DataFrame[]
26. Các khóa là tên mô-đun và các giá trị là chính mô-đun thực tế. import pandas
pandas.DataFrame[]
26 là một từ điển được lưu trong bộ nhớ cache, nếu mô-đun ở đó thì nó sẽ được trả về ngay lập tức, nếu không, nó sẽ được tìm kiếm trong hệ thốngQuay lại ví dụ trước. Khi chúng tôi nhập
from random import randint
randint[1,10]
31, hai mục được thêm vào import pandas
pandas.DataFrame[]
26. Mô-đun cấp cao nhất import pandas
pandas.DataFrame[]
5 và mô-đun con from random import randint
randint[1,10]
33import pandas
pandas.DataFrame[]
1Nếu chúng tôi nhập hai lần, lần nhập thứ hai sẽ đọc từ bộ đệm. Nhưng nếu chúng ta cố tình xóa mục từ từ điển
import pandas
pandas.DataFrame[]
26, thì lần nhập thứ hai sẽ trả về một đối tượng mô-đun mớiimport pandas
pandas.DataFrame[]
32. Thông số mô-đun tìm kiếm
Nếu mô-đun không có trong từ điển
import pandas
pandas.DataFrame[]
26, thì mô-đun đó cần được tìm kiếm trong danh sách đối tượng công cụ tìm đường dẫn meta có các phương thức import pandas
pandas.DataFrame[]
04 của chúng để xem liệu mô-đun có thể được nhập hay khôngimport pandas
pandas.DataFrame[]
6import pandas
pandas.DataFrame[]
05 được sử dụng cho các mô-đun tích hợp. import pandas
pandas.DataFrame[]
06 được sử dụng để định vị các mô-đun bị đóng băng. import pandas
pandas.DataFrame[]
07 chịu trách nhiệm tìm các mô-đun nằm ở một trong những đường dẫn nàyimport pandas
08
pandas.DataFrame[]import pandas
09
pandas.DataFrame[]import pandas
10
pandas.DataFrame[]import pandas
11
pandas.DataFrame[]
Hãy xem có gì trong
import pandas
pandas.DataFrame[]
08from random import randint
randint[1,10]
0import pandas
pandas.DataFrame[]
07 sẽ sử dụng phương pháp import pandas
pandas.DataFrame[]
14 để tìm kiếm import pandas
pandas.DataFrame[]
15 của mô-đun. Mỗi mô-đun có một đối tượng đặc tả là siêu dữ liệu của mô-đun. Một trong những thuộc tính là import pandas
pandas.DataFrame[]
16. import pandas
pandas.DataFrame[]
16 cho biết máy móc nhập khẩu sử dụng bộ tải nào trong khi tạo mô-đunfrom random import randint
randint[1,10]
13. Tải mô-đun
Sau khi tìm thấy thông số mô-đun, máy nhập sẽ sử dụng thuộc tính trình tải để khởi tạo mô-đun và lưu trữ mô-đun trong từ điển
import pandas
pandas.DataFrame[]
26. Bạn có thể đọc mã giả này để hiểu điều gì xảy ra trong quá trình tải phần nhậpNhập vòng tròn Python
Cuối cùng, hãy xem xét một vấn đề thú vị về nhập khẩu. Nhập Khẩu Thông Tư. Nhập vòng tròn xảy ra khi hai hoặc nhiều mô-đun phụ thuộc vào nhau. Trong ví dụ này,
import pandas
pandas.DataFrame[]
19 phụ thuộc vào from random import randint
randint[1,10]
33 và from random import randint
randint[1,10]
33 phụ thuộc vào import pandas
pandas.DataFrame[]
19phụ thuộc mô-đun [Tạo bởi Xiaoxu Gao]
from random import randint
randint[1,10]
2Python không thể tìm thấy thuộc tính
import pandas
pandas.DataFrame[]
33 từ mô-đun from random import randint
randint[1,10]
32. Vậy tại sao điều này xảy ra? . Khi import pandas
pandas.DataFrame[]
35, Python đi qua from random import randint
randint[1,10]
33 từng dòng một. Điều đầu tiên nó tìm thấy là import pandas
pandas.DataFrame[]
37 , vì vậy nó sẽ nhập import pandas
pandas.DataFrame[]
19. Dòng đầu tiên là nhập from random import randint
randint[1,10]
32, nhưng vì Python chưa đi qua mọi thứ trong from random import randint
randint[1,10]
33, nên chúng tôi nhận được một đối tượng được khởi tạo một nửa. Khi chúng ta gọi import pandas
pandas.DataFrame[]
61 mà python không nhìn thấy, nó sẽ đưa ra một ngoại lệ AttributeErrorNhập khẩu tròn [Tạo bởi Xiaoxu Gao]
Vậy cách khắc phục nhập vòng như thế nào? . Hầu hết thời gian, sự phụ thuộc không thực sự cần thiết. Một giải pháp đơn giản là hợp nhất cả hai chức năng thành một mô-đun duy nhất
from random import randint
randint[1,10]
3Đôi khi, mô-đun hợp nhất có thể trở nên rất lớn. Một giải pháp khác là trì hoãn việc nhập
import pandas
pandas.DataFrame[]
62 để nhập khi cần. Điều này có thể được thực hiện bằng cách đặt import pandas
pandas.DataFrame[]
37 trong hàm import pandas
pandas.DataFrame[]
64. Trong trường hợp này, Python sẽ tải tất cả các chức năng trong from random import randint
randint[1,10]
33 và sau đó chỉ tải import pandas
pandas.DataFrame[]
19 khi cầnfrom random import randint
randint[1,10]
4Nhiều cơ sở mã sử dụng nhập hoãn lại không nhất thiết phải giải quyết vấn đề phụ thuộc vòng tròn mà để tăng tốc thời gian khởi động. Một ví dụ từ Airflow là không viết mã cấp cao nhất không cần thiết để tạo DAG. Điều này là do tác động của tốc độ phân tích cú pháp mã cấp cao nhất đối với cả hiệu suất và khả năng mở rộng của Airflow
from random import randint
randint[1,10]
5Sự kết luận
Như mọi khi, tôi hy vọng bạn thấy bài viết này hữu ích và đầy cảm hứng. Chúng tôi coi nhiều thứ trong Python là điều hiển nhiên, nhưng thật thú vị khi khám phá cách nó hoạt động bên trong. Hy vọng bạn thích nó, Chúc mừng