Làm cách nào bạn có thể nhập tất cả các chức năng từ tệp python trong thư mục trước?

Mã Python trong một lần truy cập vào mã trong mô-đun khác theo quy trình của nó. Tuyên bố 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. Các chức năng như và tích hợp cũng có thể được sử dụng để gọi máy nhập

Câu lệnh kết hợp hai thao tác; . Thao tác tìm kiếm của câu lệnh

from .foo import Foo
88 được định nghĩa là một lệnh gọi hàm, với các đối số thích hợp. Giá trị trả về của được sử dụng để thực hiện thao tác liên kết tên của câu lệnh
from .foo import Foo
88. Xem câu lệnh
from .foo import Foo
88 để biết chi tiết chính xác về thao tác ràng buộc tên đó

Một cuộc gọi trực tiếp để chỉ thực hiện tìm kiếm mô-đun và, nếu tìm thấy, thao tác tạo mô-đun. Mặc dù một số tác dụng phụ nhất định có thể xảy ra, chẳng hạn như việc nhập các gói gốc và cập nhật các bộ đệm khác nhau (bao gồm cả ), nhưng chỉ có câu lệnh thực hiện thao tác liên kết tên

Khi một câu lệnh được thực thi, hàm dựng sẵn tiêu chuẩn được gọi là. Các cơ chế khác để gọi hệ thống nhập (chẳng hạn như ) có thể chọn bỏ qua và sử dụng các giải pháp của riêng chúng để triển khai ngữ nghĩa nhập

Khi một mô-đun được nhập lần đầu tiên, Python sẽ tìm kiếm mô-đun đó và nếu tìm thấy, nó sẽ tạo một đối tượng mô-đun, khởi tạo nó. Nếu không thể tìm thấy mô-đun được đặt tên, a sẽ được nâng lên. Python thực hiện các chiến lược khác nhau để tìm kiếm mô-đun được đặt tên khi máy móc nhập khẩu được gọi. Các chiến lược này có thể được sửa đổi và mở rộng bằng cách sử dụng các móc nối khác nhau được mô tả trong các phần bên dưới

Đã thay đổi trong phiên bản 3. 3. Hệ thống nhập đã được cập nhật để triển khai đầy đủ giai đoạn thứ hai của PEP 302. Không còn máy móc nhập khẩu ngầm - hệ thống nhập khẩu đầy đủ được hiển thị thông qua. Ngoài ra, hỗ trợ gói không gian tên gốc đã được triển khai (xem PEP 420).

5. 1.

Mô-đun cung cấp API phong phú để tương tác với hệ thống nhập. Ví dụ: cung cấp API được đề xuất, đơn giản hơn tích hợp sẵn để gọi máy móc nhập khẩu. Tham khảo tài liệu thư viện để biết thêm chi tiết

5. 2. Gói

Python chỉ có một loại đối tượng mô-đun và tất cả các mô-đun đều thuộc loại này, bất kể mô-đun đó được triển khai bằng Python, C hay thứ gì khác. Để giúp tổ chức các mô-đun và cung cấp hệ thống phân cấp đặt tên, Python có một khái niệm về

Bạn có thể coi các gói là các thư mục trên một hệ thống tệp và các mô-đun là các tệp trong các thư mục, nhưng đừng hiểu sự tương tự này theo nghĩa đen vì các gói và mô-đun không cần bắt nguồn từ hệ thống tệp. Đối với mục đích của tài liệu này, chúng tôi sẽ sử dụng sự tương tự thuận tiện này của các thư mục và tệp. Giống như các thư mục hệ thống tệp, các gói được tổ chức theo thứ bậc và bản thân các gói có thể chứa các gói con, cũng như các mô-đun thông thường

Điều quan trọng cần lưu ý là tất cả các gói đều là mô-đun, nhưng không phải tất cả các mô-đun đều là gói. Hay nói cách khác, các gói chỉ là một loại mô-đun đặc biệt. Cụ thể, bất kỳ mô-đun nào chứa thuộc tính

from .foo import Foo
1 được coi là một gói

Tất cả các mô-đun có một tên. Tên gói con được phân tách khỏi tên gói mẹ của chúng bằng dấu chấm, gần giống với cú pháp truy cập thuộc tính tiêu chuẩn của Python. Do đó, bạn có thể có một gói có tên là , gói này có một gói con được gọi là và một mô-đun bên trong gói con đó có tên là

from .foo import Foo
4

5. 2. 1. Gói thông thường

Python định nghĩa hai loại gói và. Các gói thông thường là các gói truyền thống khi chúng tồn tại trong Python 3. 2 trở về trước. Một gói thông thường thường được triển khai dưới dạng thư mục chứa tệp

from .foo import Foo
5. Khi một gói thông thường được nhập, tệp
from .foo import Foo
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
from .foo import Foo
5 có thể chứa mã Python giống như bất kỳ mô-đun nào khác có thể chứa và Python sẽ thêm một số thuộc tính bổ sung vào mô-đun khi nó được nhập

Ví dụ: bố cục hệ thống tệp sau xác định gói

from .foo import Foo
8 cấp cao nhất với ba gói con

parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py

Việc nhập

from .foo import Foo
9 sẽ ngầm thực thi
>>> import spam
>>> spam.foo

>>> spam.Foo

0 và
>>> import spam
>>> spam.foo

>>> spam.Foo

1. Các lần nhập tiếp theo của
>>> import spam
>>> spam.foo

>>> spam.Foo

2 hoặc
>>> import spam
>>> spam.foo

>>> spam.Foo

3 sẽ thực hiện tương ứng với
>>> import spam
>>> spam.foo

>>> spam.Foo

4 và
>>> import spam
>>> spam.foo

>>> spam.Foo

5

5. 2. 2. Gói không gian tên

Gói không gian tên là tổng hợp của nhiều gói khác nhau, trong đó mỗi phần đóng góp một gói con cho gói mẹ. Các phần có thể nằm ở các vị trí khác nhau trên hệ thống tệp. Các phần cũng có thể được tìm thấy trong tệp zip, trên mạng hoặc bất kỳ nơi nào khác mà Python tìm kiếm trong quá trình nhập. Các gói không gian tên có thể hoặc không tương ứng trực tiếp với các đối tượng trên hệ thống tệp;

Các gói không gian tên không sử dụng danh sách thông thường cho thuộc tính

from .foo import Foo
1 của chúng. Thay vào đó, họ sử dụng loại có thể lặp tùy chỉnh sẽ tự động thực hiện tìm kiếm mới cho các phần của gói trong lần nhập tiếp theo trong gói đó nếu đường dẫn của gói gốc (hoặc đối với gói cấp cao nhất) thay đổi

Với các gói không gian tên, không có tệp

>>> import spam
>>> spam.foo

>>> spam.Foo

0. Trên thực tế, có thể có nhiều thư mục
from .foo import Foo
8 được tìm thấy trong quá trình tìm kiếm nhập khẩu, trong đó mỗi thư mục được cung cấp bởi một phần khác nhau. Do đó,
from .foo import Foo
70 có thể không được đặt bên cạnh
from .foo import Foo
71. Trong trường hợp này, Python sẽ tạo một gói không gian tên cho gói
from .foo import Foo
8 cấp cao nhất bất cứ khi nào gói đó hoặc một trong các gói con của nó được nhập

Xem thêm PEP 420 để biết đặc tả gói không gian tên

5. 3. Tìm kiếm

Để bắt đầu tìm kiếm, Python cần tên của mô-đun (hoặc gói, nhưng với mục đích của cuộc thảo luận này, sự khác biệt là không quan trọng) được nhập. Tên này có thể xuất phát từ các đối số khác nhau cho câu lệnh hoặc từ các tham số cho hàm hoặc

Tên này sẽ được sử dụng trong các giai đoạn khác nhau của quá trình tìm kiếm nhập và nó có thể là đường dẫn chấm đến một mô-đun con, chẳng hạn như. g.

from .foo import Foo
76. Trong trường hợp này, trước tiên Python sẽ cố gắng nhập
from .foo import Foo
77, sau đó là
from .foo import Foo
78 và cuối cùng là
from .foo import Foo
76. Nếu bất kỳ lần nhập trung gian nào không thành công, a sẽ được nâng lên

5. 3. 1. Bộ đệm mô-đun

Vị trí đầu tiên được kiểm tra trong quá trình tìm kiếm nhập khẩu là. Ánh xạ này đóng vai trò là bộ đệm của tất cả các mô-đun đã được nhập trước đó, bao gồm cả các đường dẫn trung gian. Vì vậy, nếu

from .foo import Foo
76 đã được nhập trước đó, sẽ chứa các mục nhập cho
from .foo import Foo
77,
from .foo import Foo
78 và
from .foo import Foo
76. Mỗi khóa sẽ có giá trị là đối tượng mô-đun tương ứng

Trong quá trình nhập, tên mô-đun được tra cứu và nếu có, giá trị được liên kết là mô-đun đáp ứng yêu cầu nhập và quá trình hoàn tất. Tuy nhiên, nếu giá trị là

from .foo import Foo
88, thì a được nâng lên. Nếu tên mô-đun bị thiếu, Python sẽ tiếp tục tìm kiếm mô-đun

có thể ghi được. Việc xóa khóa có thể không hủy mô-đun được liên kết (vì các mô-đun khác có thể giữ tham chiếu đến nó), nhưng nó sẽ làm mất hiệu lực mục nhập bộ đệm cho mô-đun có tên, khiến Python phải tìm kiếm lại mô-đun có tên trong lần nhập tiếp theo. Khóa cũng có thể được gán cho

from .foo import Foo
88, buộc lần nhập mô-đun tiếp theo dẫn đến một

Mặc dù vậy, hãy cẩn thận, vì nếu bạn giữ một tham chiếu đến đối tượng mô-đun, làm mất hiệu lực mục nhập bộ đệm của nó trong , sau đó nhập lại mô-đun đã đặt tên, hai đối tượng mô-đun sẽ không giống nhau. Ngược lại, sẽ sử dụng lại cùng một đối tượng mô-đun và chỉ cần khởi tạo lại nội dung mô-đun bằng cách chạy lại mã của mô-đun

5. 3. 2. Trình tìm kiếm và trình tải

Nếu không tìm thấy mô-đun được đặt tên trong , thì giao thức nhập của Python sẽ được gọi để tìm và tải mô-đun. Giao thức này bao gồm hai đối tượng khái niệm, và. Công việc của công cụ tìm là xác định xem nó có thể tìm thấy mô-đun được đặt tên hay không bằng cách sử dụng bất kỳ chiến lược nào mà nó biết về. Các đối tượng triển khai cả hai giao diện này được gọi là - chúng tự trả về khi thấy rằng chúng có thể tải mô-đun được yêu cầu

Python bao gồm một số công cụ tìm và nhập mặc định. Cái đầu tiên biết cách định vị các mô-đun tích hợp và cái thứ hai biết cách định vị các mô-đun bị đóng băng. Công cụ tìm kiếm mặc định thứ ba tìm kiếm một mô-đun. Đây là danh sách các vị trí có thể đặt tên cho đường dẫn hệ thống tệp hoặc tệp zip. Nó cũng có thể được mở rộng để tìm kiếm bất kỳ tài nguyên có thể định vị nào, chẳng hạn như những tài nguyên được xác định bởi URL

Máy móc nhập khẩu có thể mở rộng, vì vậy có thể thêm các công cụ tìm kiếm mới để mở rộng phạm vi và phạm vi tìm kiếm mô-đun

Trình tìm kiếm không thực sự tải các mô-đun. Nếu họ có thể tìm thấy mô-đun được đặt tên, họ sẽ trả về một thông số kỹ thuật của mô-đun, một phần đóng gói thông tin liên quan đến nhập của mô-đun, mà sau đó máy móc nhập sẽ sử dụng khi tải mô-đun

Các phần sau đây mô tả chi tiết hơn về giao thức cho trình tìm và trình tải, bao gồm cách bạn có thể tạo và đăng ký những giao thức mới để mở rộng bộ máy nhập

Đã thay đổi trong phiên bản 3. 4. Trong các phiên bản trước của Python, công cụ tìm trả về trực tiếp, trong khi giờ đây, chúng trả về thông số mô-đun chứa bộ tải. Trình tải vẫn được sử dụng trong quá trình nhập nhưng có ít trách nhiệm hơn.

5. 3. 3. Móc nhập

Máy móc nhập khẩu được thiết kế để có thể mở rộng; . Có hai loại móc nhập khẩu. móc meta và móc đường dẫn nhập

Móc meta được gọi khi bắt đầu quá trình nhập, trước khi bất kỳ quá trình nhập nào khác diễn ra, ngoài tra cứu bộ đệm. Điều này cho phép các móc nối meta ghi đè quá trình xử lý, các mô-đun bị đóng băng hoặc thậm chí các mô-đun tích hợp sẵn. Móc meta được đăng ký bằng cách thêm các đối tượng công cụ tìm mới vào , như được mô tả bên dưới

Móc đường dẫn nhập được gọi là một phần của quá trình xử lý (hoặc

from .foo import Foo
880), tại điểm gặp phải mục đường dẫn liên quan của chúng. Móc đường dẫn nhập được đăng ký bằng cách thêm các hàm có thể gọi mới như được mô tả bên dưới

5. 3. 4. Đường dẫn meta

Khi không tìm thấy mô-đun có tên trong, Python sẽ tìm kiếm tiếp theo, chứa danh sách các đối tượng công cụ tìm đường dẫn meta. Những công cụ tìm này được truy vấn để xem liệu họ có biết cách xử lý mô-đun được đặt tên hay không. Công cụ tìm đường dẫn meta phải triển khai một phương thức có tên là ba đối số. tên, đường dẫn nhập và (tùy chọn) mô-đun đích. Công cụ tìm đường dẫn meta có thể sử dụng bất kỳ chiến lược nào mà nó muốn để xác định xem nó có thể xử lý mô-đun được đặt tên hay không

Nếu công cụ tìm đường dẫn meta biết cách xử lý mô-đun được đặt tên, nó sẽ trả về một đối tượng cụ thể. Nếu nó không thể xử lý mô-đun được đặt tên, nó sẽ trả về

from .foo import Foo
88. Nếu quá trình xử lý đến cuối danh sách của nó mà không trả về thông số kỹ thuật, thì a sẽ được nâng lên. Bất kỳ ngoại lệ nào khác được đưa ra chỉ đơn giản là được truyền lên, hủy bỏ quá trình nhập

Phương thức tìm đường dẫn meta được gọi với hai hoặc ba đối số. Đầu tiên là tên đủ điều kiện của mô-đun được nhập, ví dụ:

from .foo import Foo
76. Đối số thứ hai là các mục nhập đường dẫn để sử dụng cho tìm kiếm mô-đun. Đối với các mô-đun cấp cao nhất, đối số thứ hai là
from .foo import Foo
88, nhưng đối với các mô-đun con hoặc gói con, đối số thứ hai là giá trị của thuộc tính
from .foo import Foo
1 của gói mẹ. Nếu không thể truy cập thuộc tính
from .foo import Foo
1 thích hợp, a sẽ được nâng lên. Đối số thứ ba là một đối tượng mô-đun hiện có sẽ là mục tiêu tải sau này. Hệ thống nhập chỉ chuyển vào mô-đun đích trong khi tải lại

Đường dẫn meta có thể được duyệt nhiều lần cho một yêu cầu nhập. Ví dụ: giả sử không có mô-đun nào liên quan đã được lưu vào bộ nhớ cache, việc nhập

from .foo import Foo
76 trước tiên sẽ thực hiện thao tác nhập cấp cao nhất, gọi
from .foo import Foo
925 trên mỗi công cụ tìm đường dẫn meta (
from .foo import Foo
926). Sau khi
from .foo import Foo
77 đã được nhập,
from .foo import Foo
78 sẽ được nhập bằng cách duyệt qua đường dẫn meta lần thứ hai, gọi
from .foo import Foo
929. Khi
from .foo import Foo
78 đã được nhập, quá trình truyền tải cuối cùng sẽ gọi
from .foo import Foo
901

Một số công cụ tìm đường dẫn meta chỉ hỗ trợ nhập cấp cao nhất. Những nhà nhập khẩu này sẽ luôn trả về

from .foo import Foo
88 khi bất kỳ thứ gì khác ngoài
from .foo import Foo
88 được chuyển làm đối số thứ hai

Mặc định của Python có ba công cụ tìm đường dẫn meta, một công cụ biết cách nhập các mô-đun tích hợp sẵn, một công cụ biết cách nhập các mô-đun đã đóng băng và một công cụ biết cách nhập các mô-đun từ một (i. e. các )

Đã thay đổi trong phiên bản 3. 4. Đã thay thế phương pháp tìm đường dẫn meta , hiện không được dùng nữa. Mặc dù nó sẽ tiếp tục hoạt động mà không thay đổi, nhưng máy móc nhập khẩu sẽ chỉ thử nếu công cụ tìm không triển khai

from .foo import Foo
884.

Đã thay đổi trong phiên bản 3. 10. Việc sử dụng của hệ thống nhập hiện tăng.

5. 4. Đang tải

Nếu và khi tìm thấy thông số mô-đun, máy nhập sẽ sử dụng thông số đó (và trình tải mà nó chứa) khi tải mô-đun. Đây là một ước tính về những gì xảy ra trong phần tải của quá trình nhập

from .foo import Foo
9

Lưu ý các chi tiết sau

  • Nếu có một đối tượng mô-đun hiện có với tên đã cho trong , quá trình nhập sẽ trả về nó

  • Mô-đun sẽ tồn tại trước khi trình tải thực thi mã mô-đun. Điều này rất quan trọng vì mã mô-đun có thể (trực tiếp hoặc gián tiếp) nhập chính nó;

  • Nếu tải không thành công, mô-đun bị lỗi - và chỉ mô-đun bị lỗi - sẽ bị xóa khỏi. Bất kỳ mô-đun nào đã có trong bộ đệm và bất kỳ mô-đun nào đã được tải thành công dưới dạng hiệu ứng phụ đều phải nằm trong bộ đệm. Điều này trái ngược với việc tải lại trong đó ngay cả mô-đun bị lỗi vẫn ở trong

  • Sau khi mô-đun được tạo nhưng trước khi thực thi, bộ máy nhập sẽ đặt các thuộc tính mô-đun liên quan đến nhập (“_init_module_attrs” trong ví dụ mã giả ở trên), như được tóm tắt trong

  • Thực thi mô-đun là thời điểm quan trọng của quá trình tải trong đó không gian tên của mô-đun được phổ biến. Việc thực thi được ủy quyền hoàn toàn cho trình tải, trình tải này sẽ quyết định nội dung nào được phổ biến và cách thức

  • Mô-đun được tạo trong khi tải và được chuyển tới exec_module() có thể không phải là mô-đun được trả về khi kết thúc quá trình nhập

Đã thay đổi trong phiên bản 3. 4. Hệ thống nhập đã đảm nhận trách nhiệm soạn sẵn của bộ tải. Trước đây chúng được thực hiện bằng phương pháp.

5. 4. 1. Trình tải

Bộ tải mô-đun cung cấp chức năng quan trọng là tải. thực hiện mô-đun. Máy nhập gọi phương thức với một đối số duy nhất, đối tượng mô-đun để thực thi. Mọi giá trị được trả về từ đều bị bỏ qua

Bộ tải phải đáp ứng các yêu cầu sau

  • Nếu mô-đun là mô-đun Python (trái ngược với mô-đun tích hợp hoặc tiện ích mở rộng được tải động), trình tải sẽ thực thi mã của mô-đun trong không gian tên chung của mô-đun (

    from .foo import Foo
    
    919)

  • Nếu trình tải không thể thực thi mô-đun, nó sẽ đưa ra một , mặc dù bất kỳ ngoại lệ nào khác được đưa ra trong thời gian đó sẽ được lan truyền

Trong nhiều trường hợp, công cụ tìm và trình tải có thể là cùng một đối tượng;

Trình tải mô-đun có thể chọn tham gia tạo đối tượng mô-đun trong khi tải bằng cách triển khai một phương thức. Nó nhận một đối số, thông số mô-đun và trả về đối tượng mô-đun mới để sử dụng trong khi tải.

from .foo import Foo
924 không cần đặt bất kỳ thuộc tính nào trên đối tượng mô-đun. Nếu phương thức trả về
from .foo import Foo
88, máy nhập sẽ tự tạo mô-đun mới

Mới trong phiên bản 3. 4. Phương pháp bộ nạp.

Đã thay đổi trong phiên bản 3. 4. Phương pháp này đã được thay thế bằng và máy móc nhập khẩu đảm nhận tất cả các trách nhiệm tải sẵn.

Để tương thích với các bộ nạp hiện có, máy móc nhập khẩu sẽ sử dụng phương thức

from .foo import Foo
928 của bộ nạp nếu nó tồn tại và bộ nạp cũng không triển khai
from .foo import Foo
918. Tuy nhiên,
from .foo import Foo
928 không được dùng nữa và thay vào đó, các trình tải nên triển khai
from .foo import Foo
918

Phương thức

from .foo import Foo
928 phải triển khai tất cả chức năng tải soạn sẵn được mô tả ở trên ngoài việc thực thi mô-đun. Tất cả các ràng buộc tương tự được áp dụng, với một số giải thích bổ sung

  • Nếu có một đối tượng mô-đun hiện có với tên đã cho trong , trình tải phải sử dụng mô-đun hiện có đó. (Nếu không, sẽ không hoạt động chính xác. ) Nếu mô-đun được đặt tên không tồn tại trong , trình tải phải tạo một đối tượng mô-đun mới và thêm nó vào

  • Mô-đun phải tồn tại trước khi trình tải thực thi mã mô-đun, để ngăn chặn đệ quy không giới hạn hoặc tải nhiều lần

  • Nếu quá trình tải không thành công, trình tải phải xóa mọi mô-đun mà nó đã chèn vào, nhưng nó chỉ phải xóa (các) mô-đun bị lỗi và chỉ khi bản thân trình tải đã tải (các) mô-đun đó một cách rõ ràng

Đã thay đổi trong phiên bản 3. 5. A được nâng lên khi

from .foo import Foo
918 được xác định nhưng
from .foo import Foo
924 thì không.

Đã thay đổi trong phiên bản 3. 6. An được nâng lên khi

from .foo import Foo
918 được xác định nhưng
from .foo import Foo
924 thì không.

Đã thay đổi trong phiên bản 3. 10. Việc sử dụng

from .foo import Foo
928 sẽ tăng.

5. 4. 2. Mô-đun con

Khi một mô-đun con được tải bằng bất kỳ cơ chế nào (e. g.

from .foo import Foo
76 API, các câu lệnh
from .foo import Foo
88 hoặc
from .foo import Foo
951 hoặc
from .foo import Foo
90 tích hợp sẵn), một liên kết được đặt trong không gian tên của mô-đun chính tới đối tượng mô-đun con. Ví dụ: nếu gói
from .foo import Foo
953 có mô hình con
from .foo import Foo
77, sau khi nhập
from .foo import Foo
955,
from .foo import Foo
953 sẽ có thuộc tính
from .foo import Foo
77 được liên kết với mô hình con. Giả sử bạn có cấu trúc thư mục sau

from .foo import Foo
7

from .foo import Foo
958 có dòng sau trong đó

from .foo import Foo

sau đó thực hiện các ràng buộc đặt tên sau cho

from .foo import Foo
77 và
from .foo import Foo
960 trong mô-đun
from .foo import Foo
953

________số 8

Với các quy tắc ràng buộc tên quen thuộc của Python, điều này có vẻ đáng ngạc nhiên, nhưng nó thực sự là một tính năng cơ bản của hệ thống nhập. Nắm giữ bất biến là nếu bạn có

from .foo import Foo
962 và
from .foo import Foo
963 (như bạn làm sau khi nhập ở trên), cái sau phải xuất hiện dưới dạng thuộc tính
from .foo import Foo
77 của cái trước

5. 4. 3. Thông số mô-đun

Máy nhập sử dụng nhiều thông tin khác nhau về từng mô-đun trong quá trình nhập, đặc biệt là trước khi tải. Hầu hết các thông tin là chung cho tất cả các mô-đun. Mục đích của thông số kỹ thuật của mô-đun là gói gọn thông tin liên quan đến nhập này trên cơ sở từng mô-đun

Sử dụng một thông số kỹ thuật trong quá trình nhập cho phép chuyển trạng thái giữa các thành phần hệ thống nhập, e. g. giữa công cụ tìm tạo thông số mô-đun và trình tải thực thi nó. Quan trọng nhất, nó cho phép máy móc nhập khẩu thực hiện các hoạt động tải theo bản mẫu, trong khi không có thông số kỹ thuật mô-đun, trình tải có trách nhiệm đó

Thông số kỹ thuật của mô-đun được hiển thị dưới dạng thuộc tính

from .foo import Foo
965 trên đối tượng mô-đun. Xem để biết chi tiết về nội dung của thông số kỹ thuật mô-đun

Mới trong phiên bản 3. 4

5. 4. 4. Thuộc tính mô-đun liên quan đến nhập

Bộ máy nhập điền vào các thuộc tính này trên từng đối tượng mô-đun trong khi tải, dựa trên thông số kỹ thuật của mô-đun, trước khi trình tải thực thi mô-đun

__Tên__

Thuộc tính

from .foo import Foo
967 phải được đặt thành tên đầy đủ của mô-đun. Tên này được sử dụng để xác định duy nhất mô-đun trong hệ thống nhập

__bộ nạp__

Thuộc tính

from .foo import Foo
968 phải được đặt thành đối tượng trình tải mà máy nhập đã sử dụng khi tải mô-đun. Điều này chủ yếu dành cho nội quan, nhưng có thể được sử dụng cho chức năng bổ sung dành riêng cho trình tải, ví dụ: nhận dữ liệu được liên kết với trình tải

__bưu kiện__

Thuộc tính

from .foo import Foo
969 của mô-đun phải được đặt. Giá trị của nó phải là một chuỗi, nhưng nó có thể cùng giá trị với giá trị của nó là
from .foo import Foo
967. Khi mô-đun là một gói, giá trị
from .foo import Foo
969 của nó phải được đặt thành
from .foo import Foo
967. Khi mô-đun không phải là một gói, thì nên đặt
from .foo import Foo
969 thành chuỗi trống đối với các mô-đun cấp cao nhất hoặc đối với các mô-đun con, thành tên của gói chính. Xem PEP 366 để biết thêm chi tiết

Thuộc tính này được sử dụng thay vì

from .foo import Foo
967 để tính toán nhập tương đối rõ ràng cho các mô-đun chính, như được định nghĩa trong PEP 366. Dự kiến ​​nó có cùng giá trị với
from .foo import Foo
975

Đã thay đổi trong phiên bản 3. 6. Giá trị của

from .foo import Foo
969 dự kiến ​​sẽ giống như của
from .foo import Foo
975.

__spec__

Thuộc tính

from .foo import Foo
965 phải được đặt thành thông số mô-đun được sử dụng khi nhập mô-đun. Cài đặt
from .foo import Foo
965 thích hợp áp dụng như nhau cho. Một ngoại lệ là
from .foo import Foo
980, trong đó
from .foo import Foo
965 là

Khi

from .foo import Foo
969 không được xác định,
from .foo import Foo
975 được sử dụng làm phương án dự phòng

Mới trong phiên bản 3. 4

Đã thay đổi trong phiên bản 3. 6. ______3975 được sử dụng làm dự phòng khi

from .foo import Foo
969 không được xác định.

__con đường__

Nếu mô-đun là một gói (thông thường hoặc không gian tên), thuộc tính

from .foo import Foo
1 của đối tượng mô-đun phải được đặt. Giá trị phải có thể lặp lại, nhưng có thể để trống nếu
from .foo import Foo
1 không có ý nghĩa gì nữa. Nếu
from .foo import Foo
1 không trống, nó phải tạo ra các chuỗi khi lặp lại. Thêm chi tiết về ngữ nghĩa của
from .foo import Foo
1 được đưa ra

Các mô-đun không phải gói không được có thuộc tính

from .foo import Foo
1

__file____cached__

from .foo import Foo
991 là tùy chọn (nếu được đặt, giá trị phải là một chuỗi). Nó cho biết tên đường dẫn của tệp mà mô-đun được tải từ đó (nếu được tải từ tệp) hoặc tên đường dẫn của tệp thư viện dùng chung cho các mô-đun mở rộng được tải động từ thư viện dùng chung. Nó có thể bị thiếu đối với một số loại mô-đun nhất định, chẳng hạn như mô-đun C được liên kết tĩnh với trình thông dịch và hệ thống nhập có thể chọn không đặt nó nếu nó không có ý nghĩa ngữ nghĩa (e. g. một mô-đun được tải từ cơ sở dữ liệu)

Nếu

from .foo import Foo
991 được đặt thì thuộc tính
from .foo import Foo
993 cũng có thể được đặt, đây là đường dẫn đến bất kỳ phiên bản mã đã biên dịch nào (e. g. tệp biên dịch byte). Tệp không cần tồn tại để đặt thuộc tính này;

Lưu ý rằng có thể đặt

from .foo import Foo
993 ngay cả khi không đặt
from .foo import Foo
991. Tuy nhiên, kịch bản đó là khá không điển hình. Cuối cùng, trình tải là thứ sử dụng thông số mô-đun do công cụ tìm cung cấp (từ đó bắt nguồn từ
from .foo import Foo
991 và
from .foo import Foo
993). Vì vậy, nếu trình tải có thể tải từ một mô-đun được lưu trong bộ nhớ cache nhưng không tải từ tệp, thì trường hợp không điển hình đó có thể phù hợp

5. 4. 5. mô-đun. __đường__

Theo định nghĩa, nếu một mô-đun có thuộc tính

from .foo import Foo
1, thì đó là một gói

Thuộc tính

from .foo import Foo
1 của một gói được sử dụng trong quá trình nhập các gói con của nó. Trong máy móc nhập khẩu, nó hoạt động giống như, tôi. e. cung cấp danh sách các vị trí để tìm kiếm các mô-đun trong quá trình nhập. Tuy nhiên,
from .foo import Foo
1 thường bị ràng buộc nhiều hơn so với

from .foo import Foo
1 phải là một chuỗi có thể lặp lại, nhưng nó có thể trống. Các quy tắc tương tự được sử dụng cho cũng áp dụng cho ________ 01 của gói và (được mô tả bên dưới) được tham khảo khi duyệt qua ________ 01 của gói

Tệp

from .foo import Foo
5 của gói có thể đặt hoặc thay đổi thuộc tính
from .foo import Foo
1 của gói và đây thường là cách các gói không gian tên được triển khai trước PEP 420. Với việc áp dụng PEP 420, các gói không gian tên không còn cần cung cấp các tệp
from .foo import Foo
5 chỉ chứa mã thao tác
from .foo import Foo
1;

5. 4. 6. Số lần lặp lại mô-đun

Theo mặc định, tất cả các mô-đun đều có một repr có thể sử dụng được, tuy nhiên, tùy thuộc vào các thuộc tính được đặt ở trên và trong thông số kỹ thuật của mô-đun, bạn có thể kiểm soát rõ ràng hơn repr của các đối tượng mô-đun

Nếu mô-đun có thông số kỹ thuật (

from .foo import Foo
965), máy móc nhập khẩu sẽ cố gắng tạo repr từ mô-đun đó. Nếu không thành công hoặc không có thông số kỹ thuật, hệ thống nhập sẽ tạo một repr mặc định bằng cách sử dụng bất kỳ thông tin nào có sẵn trên mô-đun. Nó sẽ cố gắng sử dụng
from .foo import Foo
714,
from .foo import Foo
715 và
from .foo import Foo
716 làm đầu vào cho repr, với các giá trị mặc định cho bất kỳ thông tin nào bị thiếu

Dưới đây là các quy tắc chính xác được sử dụng

  • Nếu mô-đun có thuộc tính

    from .foo import Foo
    
    965, thông tin trong thông số kỹ thuật được sử dụng để tạo repr. Các thuộc tính “name”, “loader”, “origin” và “has_location” được tham khảo

  • Nếu mô-đun có thuộc tính

    from .foo import Foo
    
    991, thuộc tính này được sử dụng như một phần của repr mô-đun

  • Nếu mô-đun không có

    from .foo import Foo
    
    991 nhưng có
    from .foo import Foo
    
    968 không phải là
    from .foo import Foo
    
    88, thì repr của trình tải được sử dụng như một phần của repr của mô-đun

  • Nếu không, chỉ cần sử dụng mô-đun

    from .foo import Foo
    
    967 trong repr

Đã thay đổi trong phiên bản 3. 4. Việc sử dụng of đã không còn được dùng nữa và thông số kỹ thuật của mô-đun hiện được máy móc nhập khẩu sử dụng để tạo repr mô-đun.

Để tương thích ngược với Python 3. 3, mô-đun repr sẽ được tạo bằng cách gọi phương thức của trình tải, nếu được xác định, trước khi thử một trong hai phương pháp được mô tả ở trên. Tuy nhiên, phương pháp này không được chấp nhận

Đã thay đổi trong phiên bản 3. 10. Việc gọi hiện diễn ra sau khi cố gắng sử dụng thuộc tính

from .foo import Foo
965 của mô-đun nhưng trước khi quay lại
from .foo import Foo
991. Việc sử dụng dự kiến ​​​​sẽ dừng lại trong Python 3. 12.

5. 4. 7. Hủy hiệu lực mã byte đã lưu trong bộ nhớ cache

Trước khi Python tải mã byte được lưu trong bộ đệm từ tệp

from .foo import Foo
729, nó sẽ kiểm tra xem bộ đệm có được cập nhật với tệp nguồn
from .foo import Foo
730 hay không. Theo mặc định, Python thực hiện điều này bằng cách lưu trữ dấu thời gian và kích thước được sửa đổi lần cuối của nguồn trong tệp bộ đệm khi ghi nó. Khi chạy, hệ thống nhập sau đó sẽ xác thực tệp bộ đệm bằng cách kiểm tra siêu dữ liệu được lưu trữ trong tệp bộ đệm với siêu dữ liệu của nguồn

Python cũng hỗ trợ các tệp bộ đệm “dựa trên hàm băm”, lưu trữ hàm băm của nội dung tệp nguồn thay vì siêu dữ liệu của nó. Có hai biến thể của tệp

from .foo import Foo
729 dựa trên hàm băm. đã kiểm tra và bỏ chọn. Đối với các tệp
from .foo import Foo
729 dựa trên hàm băm đã kiểm tra, Python xác thực tệp bộ đệm bằng cách băm tệp nguồn và so sánh hàm băm kết quả với hàm băm trong tệp bộ đệm. Nếu một tệp bộ đệm dựa trên hàm băm đã kiểm tra được phát hiện là không hợp lệ, Python sẽ tạo lại tệp đó và ghi một tệp bộ đệm dựa trên hàm băm đã kiểm tra mới. Đối với các tệp
from .foo import Foo
729 dựa trên hàm băm không được kiểm tra, Python chỉ cần giả định rằng tệp bộ đệm là hợp lệ nếu nó tồn tại. Hành vi xác thực tệp
from .foo import Foo
729 dựa trên hàm băm có thể bị ghi đè bằng cờ

Đã thay đổi trong phiên bản 3. 7. Đã thêm tệp

from .foo import Foo
729 dựa trên hàm băm. Trước đây, Python chỉ hỗ trợ vô hiệu hóa bộ đệm mã byte dựa trên dấu thời gian.

5. 5. Trình tìm kiếm dựa trên đường dẫn

Như đã đề cập trước đây, Python đi kèm với một số công cụ tìm đường dẫn meta mặc định. Một trong số đó, được gọi là (), tìm kiếm một , chứa danh sách các. Mỗi mục nhập đường dẫn đặt tên cho một vị trí để tìm kiếm các mô-đun

Bản thân công cụ tìm đường dẫn không biết cách nhập bất cứ thứ gì. Thay vào đó, nó duyệt qua các mục nhập đường dẫn riêng lẻ, liên kết từng mục đó với một công cụ tìm mục nhập đường dẫn biết cách xử lý loại đường dẫn cụ thể đó

Bộ công cụ tìm mục nhập đường dẫn mặc định triển khai tất cả các ngữ nghĩa để tìm mô-đun trên hệ thống tệp, xử lý các loại tệp đặc biệt như mã nguồn Python (tệp _______5730), mã byte Python (tệp _______5729) và thư viện dùng chung (e. g.

from .foo import Foo
740 tệp). Khi được mô-đun hỗ trợ trong thư viện chuẩn, công cụ tìm mục nhập đường dẫn mặc định cũng xử lý tải tất cả các loại tệp này (ngoài thư viện dùng chung) từ tệp zip

Các mục nhập đường dẫn không cần giới hạn ở các vị trí hệ thống tệp. Chúng có thể tham chiếu đến URL, truy vấn cơ sở dữ liệu hoặc bất kỳ vị trí nào khác có thể được chỉ định dưới dạng chuỗi

Công cụ tìm kiếm dựa trên đường dẫn cung cấp các móc nối và giao thức bổ sung để bạn có thể mở rộng và tùy chỉnh các loại mục nhập đường dẫn có thể tìm kiếm. Ví dụ: nếu bạn muốn hỗ trợ các mục nhập đường dẫn dưới dạng URL mạng, bạn có thể viết một hook triển khai ngữ nghĩa HTTP để tìm các mô-đun trên web. Móc này (có thể gọi được) sẽ trả về một giao thức hỗ trợ được mô tả bên dưới, giao thức này sau đó được sử dụng để tải trình tải cho mô-đun từ web

Một lời cảnh báo. phần này và phần trước đều sử dụng công cụ tìm thuật ngữ, phân biệt giữa chúng bằng cách sử dụng các thuật ngữ và. Hai loại công cụ tìm này rất giống nhau, hỗ trợ các giao thức tương tự và hoạt động theo những cách tương tự nhau trong quá trình nhập, nhưng điều quan trọng cần lưu ý là chúng khác nhau một cách tinh tế. Cụ thể, công cụ tìm đường dẫn meta hoạt động khi bắt đầu quá trình nhập, khi được khóa quá trình truyền tải

Ngược lại, công cụ tìm mục nhập đường dẫn theo một nghĩa nào đó là một chi tiết triển khai của công cụ tìm dựa trên đường dẫn và trên thực tế, nếu công cụ tìm mục dựa trên đường dẫn bị xóa khỏi , thì không có ngữ nghĩa nào của công cụ tìm mục nhập đường dẫn sẽ được gọi

5. 5. 1. Công cụ tìm mục nhập đường dẫn

Chịu trách nhiệm tìm và tải các gói và mô-đun Python có vị trí được chỉ định bằng một chuỗi. Hầu hết các mục nhập đường dẫn đặt tên các vị trí trong hệ thống tệp, nhưng chúng không cần giới hạn ở đây

Là một công cụ tìm đường dẫn meta, giao thức này thực hiện giao thức được mô tả trước đó, tuy nhiên, nó hiển thị các móc nối bổ sung có thể được sử dụng để tùy chỉnh cách tìm thấy và tải các mô-đun từ

Ba biến được sử dụng bởi , , và. Các thuộc tính

from .foo import Foo
1 trên các đối tượng gói cũng được sử dụng. Những điều này cung cấp các cách bổ sung mà máy móc nhập khẩu có thể được tùy chỉnh

chứa danh sách các chuỗi cung cấp vị trí tìm kiếm cho các mô-đun và gói. Nó được khởi tạo từ biến môi trường

from .foo import Foo
750 và nhiều giá trị mặc định cài đặt và cài đặt cụ thể khác. Các mục trong có thể đặt tên cho các thư mục trên hệ thống tệp, tệp zip và các “vị trí” tiềm năng khác (xem mô-đun) sẽ được tìm kiếm cho các mô-đun, chẳng hạn như URL hoặc truy vấn cơ sở dữ liệu. Chỉ nên có các chuỗi trên ;

Là a , vì vậy máy nhập bắt đầu tìm kiếm bằng cách gọi phương thức của công cụ tìm dựa trên đường dẫn như đã mô tả trước đó. Khi đối số

from .foo import Foo
755 to được đưa ra, nó sẽ là một danh sách các đường dẫn chuỗi để duyệt qua - thường là thuộc tính
from .foo import Foo
1 của gói cho một lần nhập trong gói đó. Nếu đối số
from .foo import Foo
755 là
from .foo import Foo
88, điều này cho biết nhập cấp cao nhất và được sử dụng

Công cụ tìm dựa trên đường dẫn lặp lại qua mọi mục nhập trong đường dẫn tìm kiếm và đối với mỗi mục này, hãy tìm một () thích hợp cho mục nhập đường dẫn. Bởi vì đây có thể là một hoạt động tốn kém (e. g. có thể có chi phí cuộc gọi

from .foo import Foo
762 cho tìm kiếm này), công cụ tìm kiếm dựa trên đường dẫn duy trì các mục nhập đường dẫn ánh xạ bộ đệm tới các công cụ tìm mục nhập đường dẫn. Bộ đệm này được duy trì trong (bất chấp tên gọi, bộ đệm này thực sự lưu trữ các đối tượng tìm kiếm thay vì bị giới hạn đối với các đối tượng). Bằng cách này, việc tìm kiếm đắt tiền cho một vị trí cụ thể chỉ cần được thực hiện một lần. Mã người dùng được tự do xóa các mục trong bộ nhớ cache khỏi buộc công cụ tìm dựa trên đường dẫn thực hiện lại tìm kiếm mục nhập đường dẫn

Nếu mục nhập đường dẫn không có trong bộ đệm, công cụ tìm đường dẫn dựa trên sẽ lặp lại trên mọi lệnh có thể gọi được trong. Mỗi mục trong danh sách này được gọi với một đối số duy nhất, mục nhập đường dẫn sẽ được tìm kiếm. Cái có thể gọi này có thể trả về một cái có thể xử lý mục nhập đường dẫn hoặc nó có thể tăng. An được sử dụng bởi công cụ tìm dựa trên đường dẫn để báo hiệu rằng hook không thể tìm thấy a cho điều đó. Ngoại lệ bị bỏ qua và quá trình lặp lại tiếp tục. Cái móc sẽ mong đợi một đối tượng chuỗi hoặc byte; . g. nó có thể là mã hóa hệ thống tệp, UTF-8 hoặc thứ gì đó khác) và nếu hook không thể giải mã đối số, nó sẽ tăng

Nếu quá trình lặp lại kết thúc mà không được trả lại, thì phương thức của công cụ tìm đường dẫn sẽ lưu trữ

from .foo import Foo
88 trong (để cho biết rằng không có công cụ tìm nào cho mục nhập đường dẫn này) và trả về
from .foo import Foo
88, cho biết rằng điều này không thể tìm thấy mô-đun

Nếu a được trả về bởi một trong các hàm có thể gọi trên , thì giao thức sau đây được sử dụng để yêu cầu công cụ tìm thông số mô-đun, sau đó được sử dụng khi tải mô-đun

Thư mục làm việc hiện tại – được biểu thị bằng một chuỗi trống – được xử lý hơi khác so với các mục nhập khác trên. Đầu tiên, nếu thư mục làm việc hiện tại không tồn tại, thì không có giá trị nào được lưu trữ trong. Thứ hai, giá trị cho thư mục làm việc hiện tại được tra cứu mới cho mỗi lần tra cứu mô-đun. Thứ ba, đường dẫn được sử dụng cho và được trả về bởi sẽ là thư mục làm việc thực tế hiện tại chứ không phải chuỗi rỗng

5. 5. 2. Giao thức tìm mục nhập đường dẫn

Để hỗ trợ nhập các mô-đun và các gói đã khởi tạo và cũng để đóng góp các phần cho các gói không gian tên, các công cụ tìm mục nhập đường dẫn phải triển khai phương thức

có hai đối số. tên đủ điều kiện của mô-đun đang được nhập và mô-đun đích (tùy chọn).

from .foo import Foo
884 trả về thông số kỹ thuật được điền đầy đủ cho mô-đun. Thông số này sẽ luôn có bộ “loader” (với một ngoại lệ)

Để chỉ ra cho máy móc nhập rằng thông số kỹ thuật đại diện cho một không gian tên , công cụ tìm mục nhập đường dẫn đặt “submodule_search_locations” thành danh sách chứa phần

Đã thay đổi trong phiên bản 3. 4. được thay thế và , cả hai đều không được dùng nữa, nhưng sẽ được sử dụng nếu

from .foo import Foo
884 không được xác định.

Các công cụ tìm mục nhập đường dẫn cũ hơn có thể triển khai một trong hai phương pháp không dùng nữa này thay vì

from .foo import Foo
884. Các phương pháp vẫn được tôn trọng vì mục đích tương thích ngược. Tuy nhiên, nếu
from .foo import Foo
884 được triển khai trên công cụ tìm mục nhập đường dẫn, các phương thức cũ sẽ bị bỏ qua

nhận một đối số, tên đủ điều kiện của mô-đun được nhập.

from .foo import Foo
783 trả về 2-tuple trong đó mục đầu tiên là trình tải và mục thứ hai là không gian tên

Để tương thích ngược với các triển khai khác của giao thức nhập, nhiều công cụ tìm mục nhập đường dẫn cũng hỗ trợ cùng một phương thức truyền thống

from .foo import Foo
906 mà công cụ tìm đường dẫn meta hỗ trợ. Tuy nhiên, các phương thức tìm mục nhập đường dẫn
from .foo import Foo
906 không bao giờ được gọi với đối số
from .foo import Foo
755 (chúng phải ghi lại thông tin đường dẫn thích hợp từ lệnh gọi ban đầu đến hook đường dẫn)

Phương thức

from .foo import Foo
906 trên công cụ tìm mục nhập đường dẫn không được dùng nữa vì nó không cho phép công cụ tìm mục nhập đường dẫn đóng góp các phần vào gói không gian tên. Nếu cả
from .foo import Foo
783 và
from .foo import Foo
906 đều tồn tại trên công cụ tìm mục nhập đường dẫn, thì hệ thống nhập sẽ luôn ưu tiên gọi
from .foo import Foo
783 thay vì
from .foo import Foo
906

Đã thay đổi trong phiên bản 3. 10. Các cuộc gọi đến và bởi hệ thống nhập sẽ tăng.

5. 6. Thay thế hệ thống nhập tiêu chuẩn

Cơ chế đáng tin cậy nhất để thay thế toàn bộ hệ thống nhập là xóa nội dung mặc định của , thay thế hoàn toàn bằng móc đường dẫn meta tùy chỉnh

Nếu có thể chấp nhận chỉ thay đổi hành vi của các câu lệnh nhập mà không ảnh hưởng đến các API khác truy cập hệ thống nhập, thì việc thay thế hàm dựng sẵn có thể là đủ. Kỹ thuật này cũng có thể được sử dụng ở cấp mô-đun để chỉ thay đổi hành vi của các câu lệnh nhập trong mô-đun đó

Để ngăn chặn có chọn lọc việc nhập một số mô-đun từ hook sớm trên đường dẫn meta (thay vì vô hiệu hóa hoàn toàn hệ thống nhập tiêu chuẩn), chỉ cần tăng trực tiếp từ thay vì trả về

from .foo import Foo
88 là đủ. Cái sau chỉ ra rằng quá trình tìm kiếm đường dẫn meta sẽ tiếp tục, trong khi việc đưa ra một ngoại lệ sẽ chấm dứt nó ngay lập tức

5. 7. Số lần nhập gói tương đối

Nhập khẩu tương đối sử dụng dấu chấm hàng đầu. Một dấu chấm ở đầu biểu thị một lần nhập tương đối, bắt đầu với gói hiện tại. Hai hoặc nhiều dấu chấm ở đầu biểu thị mức nhập tương đối với (các) gói gốc của gói hiện tại, một cấp cho mỗi dấu chấm sau dấu chấm đầu tiên. Ví dụ: đưa ra cách bố trí gói sau

from .foo import Foo
7

Trong cả

from .foo import Foo
06 hoặc
from .foo import Foo
07, sau đây là nhập khẩu tương đối hợp lệ

from .foo import Foo
8

Nhập tuyệt đối có thể sử dụng cú pháp

from .foo import Foo
08 hoặc
from .foo import Foo
09, nhưng nhập tương đối chỉ có thể sử dụng biểu mẫu thứ hai;

from .foo import Foo
65

nên hiển thị

from .foo import Foo
10 dưới dạng biểu thức có thể sử dụng được, nhưng. moduleY không phải là một biểu thức hợp lệ

5. 8. Cân nhắc đặc biệt cho __main__

Mô-đun là trường hợp đặc biệt liên quan đến hệ thống nhập của Python. Như đã lưu ý, mô-đun

from .foo import Foo
980 được khởi tạo trực tiếp khi khởi động trình thông dịch, giống như và. Tuy nhiên, không giống như hai mô-đun đó, nó không hoàn toàn đủ điều kiện là mô-đun tích hợp. Điều này là do cách khởi tạo
from .foo import Foo
980 phụ thuộc vào các cờ và các tùy chọn khác mà trình thông dịch được gọi

5. 8. 1. __main__. __spec__

Tùy thuộc vào cách được khởi tạo,

from .foo import Foo
17 được đặt phù hợp hoặc thành
from .foo import Foo
88

Khi Python được khởi động với tùy chọn,

from .foo import Foo
965 được đặt thành thông số mô-đun của mô-đun hoặc gói tương ứng.
from .foo import Foo
965 cũng được điền khi mô-đun
from .foo import Foo
980 được tải như một phần của việc thực thi thư mục, tệp zip hoặc mục nhập khác

Trong

from .foo import Foo
17 được đặt thành
from .foo import Foo
88, vì mã được sử dụng để điền vào không tương ứng trực tiếp với mô-đun có thể nhập

  • lời nhắc tương tác

  • Tùy chọn

  • chạy từ stdin

  • chạy trực tiếp từ tệp mã nguồn hoặc mã byte

Lưu ý rằng

from .foo import Foo
17 luôn là
from .foo import Foo
88 trong trường hợp cuối cùng, ngay cả khi về mặt kỹ thuật, tệp có thể được nhập trực tiếp dưới dạng mô-đun. Sử dụng công tắc nếu muốn có siêu dữ liệu mô-đun hợp lệ trong

Cũng lưu ý rằng ngay cả khi

from .foo import Foo
980 tương ứng với một mô-đun có thể nhập và
from .foo import Foo
17 được đặt tương ứng, chúng vẫn được coi là các mô-đun riêng biệt. Điều này là do thực tế là các khối được bảo vệ bởi kiểm tra
from .foo import Foo
34 chỉ thực thi khi mô-đun được sử dụng để điền vào không gian tên
from .foo import Foo
980 chứ không phải trong quá trình nhập thông thường

5. 9. Tài liệu tham khảo

Máy móc nhập khẩu đã phát triển đáng kể kể từ những ngày đầu của Python. Thông số kỹ thuật ban đầu cho các gói vẫn có sẵn để đọc, mặc dù một số chi tiết đã thay đổi kể từ khi viết tài liệu đó

Thông số kỹ thuật ban đầu cho là PEP 302, với phần mở rộng tiếp theo là PEP 420

PEP 420 được giới thiệu cho Python 3. 3. PEP 420 cũng giới thiệu giao thức

from .foo import Foo
783 thay thế cho
from .foo import Foo
906

PEP 366 mô tả việc bổ sung thuộc tính

from .foo import Foo
969 để nhập tương đối rõ ràng trong các mô-đun chính

PEP 328 đã giới thiệu nhập khẩu tương đối rõ ràng và tuyệt đối và ban đầu đề xuất

from .foo import Foo
967 cho ngữ nghĩa PEP 366 cuối cùng sẽ chỉ định cho
from .foo import Foo
969

PEP 338 định nghĩa các mô-đun thực thi dưới dạng tập lệnh

PEP 451 thêm tính năng đóng gói trạng thái nhập theo mô-đun trong các đối tượng cụ thể. Nó cũng giảm tải hầu hết các trách nhiệm soạn sẵn của người bốc xếp trở lại máy móc nhập khẩu. Những thay đổi này cho phép ngừng sử dụng một số API trong hệ thống nhập và cũng bổ sung các phương thức mới cho trình tìm và trình tải

chú thích

Nhìn thấy

Việc triển khai importlib tránh sử dụng trực tiếp giá trị trả về. Thay vào đó, nó lấy đối tượng mô-đun bằng cách tra cứu tên mô-đun trong. Tác động gián tiếp của việc này là một mô-đun đã nhập có thể thay thế chính nó trong. Đây là hành vi dành riêng cho triển khai không được đảm bảo hoạt động trong các triển khai Python khác

Trong mã kế thừa, có thể tìm thấy các phiên bản của trong. Thay vào đó, nên thay đổi mã để sử dụng

from .foo import Foo
88. Xem để biết thêm chi tiết

Làm cách nào bạn có thể nhập tất cả các chức năng từ tệp Python trong thư mục trước đó?

Để nhập một mô-đun, thư mục chứa mô-đun đó phải có trên PYTHONPATH . Nó là một biến môi trường chứa danh sách các gói sẽ được Python tải. Danh sách các gói có trong PYTHONPATH cũng có trong sys. đường dẫn, vì vậy sẽ thêm đường dẫn thư mục mẹ vào sys.

Làm cách nào để nhập một hàm từ một tệp Python khác trong thư mục khác?

Chúng ta có thể sử dụng sys. path để thêm đường dẫn của thư mục khác mới (thư mục từ nơi chúng tôi muốn nhập các mô-đun) vào đường dẫn hệ thống để Python cũng có thể xem .

Làm cách nào để nhập mô-đun từ một thư mục khác trong Python?

Cách Pythonic nhất để nhập mô-đun từ một thư mục khác là đặt một tệp trống có tên __init__. py vào thư mục đó và sử dụng đường dẫn tương đối có ký hiệu dấu chấm . Ví dụ: một mô-đun trong thư mục mẹ sẽ được nhập từ. mô-đun nhập khẩu.

Chúng ta có thể nhập hàm trong Python không?

Để sử dụng các chức năng trong mô-đun, bạn cần nhập mô-đun bằng câu lệnh nhập. Câu lệnh nhập được tạo thành từ từ khóa nhập cùng với tên của mô-đun. Trong một tệp Python, điều này sẽ được khai báo ở đầu mã, dưới bất kỳ dòng shebang hoặc nhận xét chung nào