__ spec __ trăn là gì?
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 Show import random from random import randint 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 9 và làm cho nó có sẵn để sử dụng, sau đó nó truy cập vào import pandas 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 1Bạn cũng có thể nhập import pandas 2 như thế nàyfrom random import randint Hãy xem một ví dụ từ một gói import pandas 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 3 thay vì import pandas 4. Một gói chứa các mô-đun con hoặc đệ quy, các gói con và import pandas 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 6 và import pandas 7 tích hợp cũng có thể được sử dụng>>> import importlib Bưu kiện. __trong đó__. pyVậy import pandas 5 là gì?
Hãy xem một ví dụ. Tôi có một cấu trúc thư mục như thế này. >>> import importlib1 là gói của tôi và >>> import importlib2 là mô hình con Bên trong >>> import importlib3 , tôi có một biến số >>> import importlib4 mà tôi muốn sử dụng trong biến >>> import importlib5. Tôi sẽ tạo một số phiên bản của import pandas 5 và xem nó ảnh hưởng như thế nào đến việc nhập vào >>> import importlib5 # m1.py Trường hợp 1. tập tin >>> import importlib8 trống Vì tệp import pandas 5 trống khi chúng tôi nhập >>> import importlib1 , không có mô hình con nào được nhập, do đó, nó không biết sự tồn tại của >>> import importlib2. Nếu chúng ta nhập >>> import importlib2 rõ ràng bằng cách sử dụng # m1.py 3 , thì mọi thứ bên trong >>> import importlib3 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ạt # main.py Trường hợp2. nhập các mô-đun con trong tệp >>> import importlib8 Thay vì để trống, chúng tôi nhập mọi thứ từ >>> import importlib2 vào tệp import pandas 5. Sau đó, # m1.py 8 trong tệp >>> import importlib5 sẽ nhận ra các biến trong >>> import importlib3 và bạn có thể gọi trực tiếp # main.py1 mà không cần biết nó đến từ mô-đun nào # __init__.py Bạn có thể đã nhận thấy dấu chấm trước khi >>> import importlib2. Đó 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ư # main.py3 Có một báo trước 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 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ỗi khi bạn nhập một mô-đun, thứ đầu tiên được tìm kiếm là từ điển # main.py6. Các khóa là tên mô-đun và các giá trị là chính mô-đun thực tế. # main.py6 là một từ điển được lưu trong bộ nhớ đệm, 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ống Quay lại ví dụ trước. Khi chúng tôi nhập >>> import importlib1, hai mục được thêm vào # main.py6. Mô-đun cấp cao nhất import pandas 5 và mô-đun con >>> import importlib3 import p1 Nếu chúng ta 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 # main.py6, thì lần nhập thứ hai sẽ trả về một đối tượng mô-đun mới # read from cache 2. Thông số mô-đun tìm kiếm Nếu mô-đun không có trong từ điển # main.py6, thì nó cần được tìm kiếm theo danh sách các đối tượng có phương thức # __init__.py4 của chúng để xem liệu mô-đun có thể được nhập hay không import sys # __init__.py5 được sử dụng cho các mô-đun tích hợp. # __init__.py6 được sử dụng để định vị các mô-đun bị đóng băng. # __init__.py7 chịu trách nhiệm tìm các mô-đun nằm ở một trong những đường dẫn này
Hãy xem có gì trong # __init__.py8 from random import randint 0# __init__.py7 sẽ sử dụng phương pháp import p14 để tìm kiếm import p15 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 p16. import p16 cho biết máy móc nhập khẩu sử dụng bộ tải nào trong khi tạo mô-đun from random import randint 13. Tải mô-đun Sau khi tìm thấy thông số kỹ thuật của 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ữ nó trong từ điển # main.py6. Bạn có thể đọc phần này để hiểu điều gì xảy ra trong quá trình tải phần nhập Nhập vòng tròn PythonCuố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 p19 phụ thuộc vào >>> import importlib3 và >>> import importlib3 phụ thuộc vào import p19phụ thuộc mô-đun (Tạo bởi Xiaoxu Gao) from random import randint 2Python không thể tìm thấy thuộc tính # read from cache3 từ mô-đun >>> import importlib2. Vậy tại sao điều này xảy ra? . Khi # read from cache5, Python đi qua >>> import importlib3 từng dòng một. Điều đầu tiên nó tìm thấy là # read from cache7 , vì vậy nó sẽ nhập import p19. Dòng đầu tiên là nhập >>> import importlib2, nhưng vì Python chưa đi qua mọi thứ trong >>> import importlib3, 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 sys 1 mà python không nhìn thấy nó, 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 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 khẩu import sys 2 để nhập khẩu khi cần thiết. Điều này có thể được thực hiện bằng cách đặt # read from cache7 trong hàm import sys 4. Trong trường hợp này, Python sẽ tải tất cả các chức năng trong >>> import importlib3 và sau đó chỉ tải import p19 khi cần thiết from random import randint 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ừ 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 5Phần kết luậnNhư 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 Thông số mô-đun Python là gì?máy có tên là “ModuleSpec”. Nó sẽ cung cấp tất cả thông tin liên quan đến nhập được sử dụng để tải mô-đun và sẽ khả dụng mà không cần tải mô-đun trước. Trình tìm kiếm sẽ trực tiếp cung cấp thông số kỹ thuật của mô-đun thay vì trình tải (họ sẽ tiếp tục cung cấp gián tiếp).
__ tất cả __ trong Python là gì?Danh sách các chuỗi xác định biến nào phải được nhập vào tệp khác được gọi là __all__ trong Python. Các biến được khai báo trong danh sách đó chỉ có thể được sử dụng trong tệp khác sau khi nhập tệp này, các biến còn lại nếu được gọi sẽ báo lỗi.
Sự khác biệt giữa __ nhập __ và nhập trong Python là gì?Điều này có nghĩa là tất cả ngữ nghĩa của hàm được lấy từ importlib. __nhập khẩu__(). Sự khác biệt quan trọng nhất giữa hai hàm này là import_module() trả về gói hoặc mô-đun đã chỉ định (e. g. pkg. mod ), trong khi __import__() trả về gói hoặc mô-đun cấp cao nhất (e. g. pkg ) .
Hệ thống nhập khẩu trong Python là gì?Mã Python trong một mô-đun có quyền truy cập vào mã trong một mô-đun khác bằng quá trình nhập mã đó . Câu lệnh nhập khẩu là cách phổ biến nhất để gọi máy móc nhập khẩu, nhưng nó không phải là cách duy nhất. |