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 Show
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 Foo88 đượ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 Foo88. Xem câu lệnh from .foo import Foo88 để 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óiPython 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 Foo1 đượ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 Foo4 5. 2. 1. Gói thông thườngPython đị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 Foo5. Khi một gói thông thường được nhập, tệp from .foo import Foo5 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 Foo5 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 Foo8 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 Foo9 sẽ ngầm thực thi >>> import spam >>> spam.foo0 và >>> import spam >>> spam.foo1. Các lần nhập tiếp theo của >>> import spam >>> spam.foo2 hoặc >>> import spam >>> spam.foo3 sẽ thực hiện tương ứng với >>> import spam >>> spam.foo4 và >>> import spam >>> spam.foo5 5. 2. 2. Gói không gian tênGó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 Foo1 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.foo0. Trên thực tế, có thể có nhiều thư mục from .foo import Foo8 đượ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 Foo70 có thể không được đặt bên cạnh from .foo import Foo71. 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 Foo8 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 Foo76. Trong trường hợp này, trước tiên Python sẽ cố gắng nhập from .foo import Foo77, sau đó là from .foo import Foo78 và cuối cùng là from .foo import Foo76. 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ô-đunVị 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 Foo76 đã được nhập trước đó, sẽ chứa các mục nhập cho from .foo import Foo77, from .foo import Foo78 và from .foo import Foo76. 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 Foo88, 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 Foo88, 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ảiNế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ậpMá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 Foo880), 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 metaKhi 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 Foo88. 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 Foo76. Đố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 Foo88, 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 Foo1 của gói mẹ. Nếu không thể truy cập thuộc tính from .foo import Foo1 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 Foo76 trước tiên sẽ thực hiện thao tác nhập cấp cao nhất, gọi from .foo import Foo925 trên mỗi công cụ tìm đường dẫn meta ( from .foo import Foo926). Sau khi from .foo import Foo77 đã được nhập, from .foo import Foo78 sẽ được nhập bằng cách duyệt qua đường dẫn meta lần thứ hai, gọi from .foo import Foo929. Khi from .foo import Foo78 đã được nhập, quá trình truyền tải cuối cùng sẽ gọi from .foo import Foo901 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 Foo88 khi bất kỳ thứ gì khác ngoài from .foo import Foo88 đượ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 Foo884. Đã 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ảiNế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 Foo9 Lưu ý các chi tiết sau
Đã 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ảiBộ 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
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 Foo924 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 Foo88, 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 Foo928 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 Foo918. Tuy nhiên, from .foo import Foo928 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 Foo918 Phương thức from .foo import Foo928 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
Đã thay đổi trong phiên bản 3. 5. A được nâng lên khi from .foo import Foo918 được xác định nhưng from .foo import Foo924 thì không. Đã thay đổi trong phiên bản 3. 6. An được nâng lên khi from .foo import Foo918 được xác định nhưng from .foo import Foo924 thì không. Đã thay đổi trong phiên bản 3. 10. Việc sử dụng from .foo import Foo928 sẽ tăng. 5. 4. 2. Mô-đun conKhi một mô-đun con được tải bằng bất kỳ cơ chế nào (e. g. from .foo import Foo76 API, các câu lệnh from .foo import Foo88 hoặc from .foo import Foo951 hoặc from .foo import Foo90 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 Foo953 có mô hình con from .foo import Foo77, sau khi nhập from .foo import Foo955, from .foo import Foo953 sẽ có thuộc tính from .foo import Foo77 đượ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 Foo7 và from .foo import Foo958 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 Foo77 và from .foo import Foo960 trong mô-đun from .foo import Foo953 ________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 Foo962 và from .foo import Foo963 (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 Foo77 của cái trước 5. 4. 3. Thông số mô-đunMá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 Foo965 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ậpBộ 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 Foo967 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 Thuộc tính from .foo import Foo968 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 Foo969 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 Foo967. Khi mô-đun là một gói, giá trị from .foo import Foo969 của nó phải được đặt thành from .foo import Foo967. Khi mô-đun không phải là một gói, thì nên đặt from .foo import Foo969 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 Foo967 để 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 Foo975 Đã thay đổi trong phiên bản 3. 6. Giá trị của from .foo import Foo969 dự kiến sẽ giống như của from .foo import Foo975. __spec__ Thuộc tính from .foo import Foo965 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 Foo965 thích hợp áp dụng như nhau cho. Một ngoại lệ là from .foo import Foo980, trong đó from .foo import Foo965 là Khi from .foo import Foo969 không được xác định, from .foo import Foo975 đượ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 Foo969 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 Foo1 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 Foo1 không có ý nghĩa gì nữa. Nếu from .foo import Foo1 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 Foo1 được đưa ra Các mô-đun không phải gói không được có thuộc tính from .foo import Foo1__file____cached__ from .foo import Foo991 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 Foo991 được đặt thì thuộc tính from .foo import Foo993 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 Foo993 ngay cả khi không đặt from .foo import Foo991. 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 Foo991 và from .foo import Foo993). 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 Foo1, thì đó là một gói Thuộc tính from .foo import Foo1 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 Foo1 thường bị ràng buộc nhiều hơn so với from .foo import Foo1 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 Foo5 của gói có thể đặt hoặc thay đổi thuộc tính from .foo import Foo1 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 Foo5 chỉ chứa mã thao tác from .foo import Foo1; 5. 4. 6. Số lần lặp lại mô-đunTheo 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 Foo965), 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 Foo714, from .foo import Foo715 và from .foo import Foo716 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
Đã 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 Foo965 của mô-đun nhưng trước khi quay lại from .foo import Foo991. 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ớ cacheTrước khi Python tải mã byte được lưu trong bộ đệm từ tệp from .foo import Foo729, nó sẽ kiểm tra xem bộ đệm có được cập nhật với tệp nguồn from .foo import Foo730 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 Foo729 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 Foo729 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 Foo729 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 Foo729 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 Foo729 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ẫnNhư đã đề 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 Foo740 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ẫnChị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 Foo1 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 Foo750 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 Foo755 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 Foo1 của gói cho một lần nhập trong gói đó. Nếu đối số from .foo import Foo755 là from .foo import Foo88, đ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 Foo762 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 Foo88 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 Foo88, 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 Foo884 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 Foo884 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 Foo884. 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 Foo884 đượ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 Foo783 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 Foo906 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 Foo906 không bao giờ được gọi với đối số from .foo import Foo755 (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 Foo906 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 Foo783 và from .foo import Foo906 đề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 Foo783 thay vì from .foo import Foo906 Đã 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ẩnCơ 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 Foo88 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 đốiNhậ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 Foo7 Trong cả from .foo import Foo06 hoặc from .foo import Foo07, sau đây là nhập khẩu tương đối hợp lệ from .foo import Foo8 Nhập tuyệt đối có thể sử dụng cú pháp from .foo import Foo08 hoặc from .foo import Foo09, nhưng nhập tương đối chỉ có thể sử dụng biểu mẫu thứ hai; from .foo import Foo65 nên hiển thị from .foo import Foo10 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 Foo980 đượ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 Foo980 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 Foo17 được đặt phù hợp hoặc thành from .foo import Foo88 Khi Python được khởi động với tùy chọn, from .foo import Foo965 được đặt thành thông số mô-đun của mô-đun hoặc gói tương ứng. from .foo import Foo965 cũng được điền khi mô-đun from .foo import Foo980 đượ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 Foo17 được đặt thành from .foo import Foo88, 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ưu ý rằng from .foo import Foo17 luôn là from .foo import Foo88 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 Foo980 tương ứng với một mô-đun có thể nhập và from .foo import Foo17 đượ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 Foo34 chỉ thực thi khi mô-đun được sử dụng để điền vào không gian tên from .foo import Foo980 chứ không phải trong quá trình nhập thông thường 5. 9. Tài liệu tham khảoMá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 Foo783 thay thế cho from .foo import Foo906 PEP 366 mô tả việc bổ sung thuộc tính from .foo import Foo969 để 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 Foo967 cho ngữ nghĩa PEP 366 cuối cùng sẽ chỉ định cho from .foo import Foo969 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 Foo88. 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 |