Bạn có thể nhập nhiều mô-đun bằng Python không?

Đối với hầu hết các lập trình viên mới bắt đầu và trung cấp, đôi khi làm việc với nhiều thư mục trong các dự án Python có thể gây khó chịu. Là một lập trình viên Python, cách tốt nhất là trừu tượng hóa mã ứng dụng thành các tệp và thư mục khác nhau và theo các yêu cầu dữ liệu và chức năng liên quan của chúng. Hơn nữa, bạn sẽ không có tùy chọn nào ngoài việc sử dụng các gói và mô-đun hiện có mà người khác đã viết. Điều này sẽ yêu cầu khả năng làm việc hiệu quả trong nhiều gói thư mục trong dự án của bạn

Tầm quan trọng của việc làm việc với các thư mục đa cấp trong mã dự án của bạn

  1. Tính mô đun của mã. Để viết giải pháp cho các vấn đề lớn hơn, điều quan trọng là phải chia dự án của bạn thành các phần nhỏ hơn, trong đó mỗi vấn đề nhỏ hơn được triển khai trong một thư mục con riêng biệt trong dự án của bạn. Điều này sẽ cho phép bạn tập trung vào các bài toán con nhỏ hơn, ít gây choáng ngợp hơn và dễ giải quyết hơn.
  2. Khả năng sử dụng lại mã. Điều quan trọng là mã dự án của bạn phải tuân theo nguyên tắc DRY [Don't Repeat Yourself]. Khi bạn tìm thấy nhiều phần mã về cơ bản đang cố gắng làm điều tương tự, có điều gì đó không đúng. Khi bạn trừu tượng hóa mã của mình bằng cách triển khai logic đơn lẻ hoặc có liên quan vào các mô-đun và gói con riêng lẻ, thì bạn có thể sử dụng chúng ở bất kỳ đâu trong dự án của mình bằng cách chỉ nhập chúng thay vì cố gắng viết lại chúng ở nơi khác trong dự án của bạn
  3. Khả năng bảo trì của mã. Đây có lẽ là lý do quan trọng nhất để thực hiện trừu tượng hóa mã. Điều rất quan trọng là các phần mã dự án của bạn phải được kết hợp lỏng lẻo với nhau. Khi bạn phải sửa đổi một số phần trong mã dự án của mình chỉ vì bạn đã thực hiện thay đổi một phần nhỏ trong dự án của mình, thì chắc chắn có điều gì đó không ổn. Mã dự án của bạn không cần quá phụ thuộc lẫn nhau. Sự phụ thuộc lẫn nhau nên được giữ ở mức tối thiểu nhất. Mã dự án tốt sẽ cho phép bất kỳ ai không có kiến ​​thức bên ngoài dự án dễ dàng thực hiện các thay đổi đối với nó. Điều này sẽ giúp ích trong quá trình hợp tác nhóm. Khi bạn sử dụng tốt các gói con và mô-đun, bạn chỉ phải thay đổi mô-đun cụ thể mà bạn cần thay đổi

Tuy nhiên, làm việc với nhiều cấp thư mục trong một dự án có thể gây khó khăn cho các lập trình viên mới bắt đầu và sử dụng các gói hoặc mô-đun của bên thứ ba trong các chương trình của riêng họ. Trong bài viết này, tôi cung cấp một cách đơn giản để dễ dàng xử lý việc nhập tệp trong mã dự án thư mục đa cấp. [Để biết cách cấu trúc các dự án Python, hãy tham khảo tài liệu Python ở cuối bài này. ]

Nhập tệp trong cấu trúc thư mục đa cấp

Theo cú pháp Python, dấu chấm ở đầu biểu thị thư mục hiện tại. Mỗi dấu chấm bổ sung sẽ đưa bạn lên một thư mục hoặc gói cao hơn. Thông thường, nên sử dụng nhập tuyệt đối thay vì nhập tương đối trong mã của bạn

Hãy sử dụng một dự án Python có cấu trúc thư mục [như hình bên dưới] để chứng minh việc nhập từ một thư mục đa cấp dễ dàng như thế nào bằng cách sử dụng cả nhập tuyệt đối và tương đối

Ghi chú. Trong Python, mỗi thư mục hoặc thư mục con phải được khởi tạo bằng __init__. py để nó được công nhận là gói hoặc gói con. Nếu không, bạn có thể gặp lỗi không tìm thấy mô-đun khi cố gắng nhập

Khi ở trong thư mục myPackage và để truy cập bảo mật. tệp py trong __init__. py của myPackage trong cùng thư mục

import security   #absolute import   
from . import  security #relative import

Tuy nhiên, đối với tệp sâu hơn một cấp, khi ở trong __init__. py của myPackage và nhập mục. py trong thư mục con1

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import

Đối với tệp sâu hơn hai cấp độ, khi ở trong __init__. py của myPackage và nhập người dùng. py từ thư mục con2

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import

Khía cạnh khó khăn nhất là phải nhập ngược một tệp—tức là, từ cấp cao hơn vào một tệp trong thư mục cấp thấp hơn. Nhập tuyệt đối làm cho điều này dễ dàng hơn

Để truy cập bảo mật. py từ sinh viên. py của thư mục con2

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import

Để truy cập tài khoản. py trong thư mục con3 từ người dùng. py trong thư mục con2

import myPackage.subfolder3.accounts #absolute import
from  myPackage.subfolder3 import accounts #absolute import
from ...subfolder3 import accounts #relative import

Để truy cập người dùng. py từ sinh viên. py trong cùng thư mục con2, chỉ cần

import user  # python3
from . import user # any python version

Tóm tắt mã của bạn thành các gói con hoặc mô-đun sẽ giúp bạn viết mã dễ bảo trì. Tôi hy vọng điều này sẽ giúp giảm đau đầu khi làm việc trong gói hoặc mô-đun thư mục đa cấp

Nếu bạn thoát khỏi trình thông dịch Python và nhập lại, các định nghĩa bạn đã tạo [hàm và biến] sẽ bị mất. Do đó, nếu bạn muốn viết một chương trình dài hơn một chút, tốt hơn hết bạn nên sử dụng trình soạn thảo văn bản để chuẩn bị đầu vào cho trình thông dịch và chạy nó với tệp đó làm đầu vào thay thế. Điều này được gọi là tạo một kịch bản. Khi chương trình của bạn dài hơn, bạn có thể muốn chia nó thành nhiều tệp để bảo trì dễ dàng hơn. Bạn cũng có thể muốn sử dụng một chức năng tiện dụng mà bạn đã viết trong một số chương trình mà không cần sao chép định nghĩa của nó vào từng chương trình

Để hỗ trợ điều này, Python có một cách để đưa các định nghĩa vào một tệp và sử dụng chúng trong một tập lệnh hoặc trong một phiên bản tương tác của trình thông dịch. Một tệp như vậy được gọi là một mô-đun;

Một mô-đun là một tệp chứa các định nghĩa và câu lệnh Python. Tên tệp là tên mô-đun có hậu tố

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
7 được thêm vào. Trong một mô-đun, tên của mô-đun [dưới dạng chuỗi] có sẵn dưới dạng giá trị của biến toàn cục
>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
8. Chẳng hạn, sử dụng trình soạn thảo văn bản yêu thích của bạn để tạo tệp có tên
>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
9 trong thư mục hiện tại với nội dung sau

# Fibonacci numbers module

def fib[n]:    # write Fibonacci series up to n
    a, b = 0, 1
    while a > fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Nếu bạn có ý định sử dụng một chức năng thường xuyên, bạn có thể gán nó cho một tên địa phương

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
1

6. 1. Thông tin thêm về Mô-đun¶

Một mô-đun có thể chứa các câu lệnh thực thi cũng như các định nghĩa hàm. Các câu lệnh này nhằm mục đích khởi tạo mô-đun. Chúng chỉ được thực thi khi tên mô-đun xuất hiện lần đầu tiên trong câu lệnh nhập. 1 [Chúng cũng được chạy nếu tệp được thực thi dưới dạng tập lệnh. ]

Mỗi mô-đun có không gian tên riêng của nó, được sử dụng làm không gian tên chung bởi tất cả các chức năng được xác định trong mô-đun. Do đó, tác giả của một mô-đun có thể sử dụng các biến toàn cục trong mô-đun mà không phải lo lắng về xung đột tình cờ với các biến toàn cục của người dùng. Mặt khác, nếu bạn biết mình đang làm gì, bạn có thể chạm vào các biến toàn cục của mô-đun với cùng một ký hiệu được sử dụng để chỉ các chức năng của nó,

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
12

Các mô-đun có thể nhập các mô-đun khác. Theo thông lệ nhưng không bắt buộc phải đặt tất cả các câu lệnh

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
13 ở đầu mô-đun [hoặc tập lệnh, đối với vấn đề đó]. Tên mô-đun đã nhập, nếu được đặt ở cấp cao nhất của mô-đun [bên ngoài bất kỳ chức năng hoặc lớp nào], sẽ được thêm vào không gian tên chung của mô-đun

Có một biến thể của câu lệnh

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
13 nhập tên từ mô-đun trực tiếp vào không gian tên của mô-đun nhập. Ví dụ

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
8

Điều này không giới thiệu tên mô-đun mà quá trình nhập được thực hiện trong không gian tên cục bộ [vì vậy trong ví dụ,

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
10 không được xác định]

Thậm chí còn có một biến thể để nhập tất cả các tên mà mô-đun xác định

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
0

Thao tác này nhập tất cả các tên ngoại trừ những tên bắt đầu bằng dấu gạch dưới [

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
16]. Trong hầu hết các trường hợp, các lập trình viên Python không sử dụng tiện ích này vì nó đưa một bộ tên không xác định vào trình thông dịch, có thể ẩn một số thứ bạn đã xác định

Lưu ý rằng nói chung, việc nhập

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
17 từ một mô-đun hoặc gói không được chấp nhận, vì nó thường gây ra mã khó đọc. Tuy nhiên dùng để tiết kiệm gõ trong các buổi tương tác cũng được

Nếu tên mô-đun được theo sau bởi

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
18, thì tên theo sau
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
18 được liên kết trực tiếp với mô-đun đã nhập

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
5

Điều này đang nhập mô-đun một cách hiệu quả giống như cách mà

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
80 sẽ thực hiện, với sự khác biệt duy nhất là nó có sẵn dưới dạng
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
81

Nó cũng có thể được sử dụng khi sử dụng

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
82 với tác dụng tương tự

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
9

Ghi chú

Vì lý do hiệu quả, mỗi mô-đun chỉ được nhập một lần cho mỗi phiên phiên dịch. Do đó, nếu bạn thay đổi các mô-đun của mình, bạn phải khởi động lại trình thông dịch – hoặc, nếu đó chỉ là một mô-đun mà bạn muốn kiểm tra tương tác, hãy sử dụng

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
83, e. g.
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
84

6. 1. 1. Thực thi các mô-đun dưới dạng tập lệnh¶

Khi bạn chạy một mô-đun Python với

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
2

mã trong mô-đun sẽ được thực thi, giống như khi bạn nhập mã, nhưng với

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
8 được đặt thành
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
86. Điều đó có nghĩa là bằng cách thêm mã này vào cuối mô-đun của bạn

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
5

bạn có thể làm cho tệp có thể sử dụng được dưới dạng tập lệnh cũng như mô-đun có thể nhập, bởi vì mã phân tích cú pháp dòng lệnh chỉ chạy nếu mô-đun được thực thi dưới dạng tệp "chính"

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
00

Nếu mô-đun được nhập, mã không chạy

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
01

Điều này thường được sử dụng để cung cấp giao diện người dùng thuận tiện cho mô-đun hoặc cho mục đích thử nghiệm [chạy mô-đun dưới dạng tập lệnh thực thi bộ thử nghiệm]

6. 1. 2. Đường dẫn tìm kiếm mô-đun¶

Khi một mô-đun có tên

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
87 được nhập vào, trước tiên trình thông dịch sẽ tìm kiếm một mô-đun tích hợp có tên đó. Những tên mô-đun này được liệt kê trong
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
88. Nếu không tìm thấy, nó sẽ tìm kiếm một tệp có tên
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
89 trong danh sách các thư mục được cung cấp bởi biến
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
00.
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
00 được khởi tạo từ những vị trí này

  • Thư mục chứa tập lệnh đầu vào [hoặc thư mục hiện tại khi không có tệp nào được chỉ định]

  • import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    02 [danh sách tên thư mục, có cùng cú pháp với biến hệ vỏ
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    03]

  • Mặc định phụ thuộc vào cài đặt [theo quy ước bao gồm một thư mục

    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    04, được xử lý bởi mô-đun
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    05]

Thông tin chi tiết có tại Việc khởi tạo hệ thống. đường dẫn tìm kiếm mô-đun đường dẫn .

Ghi chú

Trên các hệ thống tệp hỗ trợ liên kết tượng trưng, ​​thư mục chứa tập lệnh đầu vào được tính sau khi liên kết tượng trưng được theo dõi. Nói cách khác, thư mục chứa liên kết tượng trưng không được thêm vào đường dẫn tìm kiếm mô-đun

Sau khi khởi tạo, các chương trình Python có thể sửa đổi

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
00. Thư mục chứa tập lệnh đang chạy được đặt ở đầu đường dẫn tìm kiếm, phía trước đường dẫn thư viện chuẩn. Điều này có nghĩa là các tập lệnh trong thư mục đó sẽ được tải thay vì các mô-đun cùng tên trong thư mục thư viện. Đây là một lỗi trừ khi dự định thay thế. Xem phần Mô-đun tiêu chuẩn để biết thêm thông tin.

6. 1. 3. Tệp Python “đã biên dịch”¶

Để tăng tốc độ tải các mô-đun, Python lưu trữ phiên bản đã biên dịch của từng mô-đun trong thư mục

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
07 dưới tên
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
08, trong đó phiên bản mã hóa định dạng của tệp đã biên dịch; . Ví dụ: trong bản phát hành CPython 3. 3 phiên bản biên dịch của thư rác. py sẽ được lưu vào bộ nhớ cache dưới dạng
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
09. Quy ước đặt tên này cho phép các mô-đun được biên dịch từ các bản phát hành khác nhau và các phiên bản Python khác nhau cùng tồn tại

Python kiểm tra ngày sửa đổi của nguồn so với phiên bản đã biên dịch để xem nó có lỗi thời và cần biên dịch lại không. Đây là một quá trình hoàn toàn tự động. Ngoài ra, các mô-đun được biên dịch độc lập với nền tảng, do đó, cùng một thư viện có thể được chia sẻ giữa các hệ thống có kiến ​​trúc khác nhau

Python không kiểm tra bộ đệm trong hai trường hợp. Đầu tiên, nó luôn biên dịch lại và không lưu trữ kết quả cho mô-đun được tải trực tiếp từ dòng lệnh. Thứ hai, nó không kiểm tra bộ đệm nếu không có mô-đun nguồn. Để hỗ trợ phân phối không phải nguồn [chỉ được biên dịch], mô-đun đã biên dịch phải nằm trong thư mục nguồn và không được có mô-đun nguồn

Một số lời khuyên cho các chuyên gia

  • Bạn có thể sử dụng công tắc

    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    50 hoặc
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    51 trên lệnh Python để giảm kích thước của mô-đun đã biên dịch. Công tắc
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    50 loại bỏ câu lệnh khẳng định, công tắc
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    51 loại bỏ cả câu lệnh khẳng định và chuỗi __doc__. Vì một số chương trình có thể dựa vào việc có sẵn những thứ này, bạn chỉ nên sử dụng tùy chọn này nếu bạn biết mình đang làm gì. Các mô-đun “Được tối ưu hóa” có thẻ
    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    54 và thường nhỏ hơn. Các bản phát hành trong tương lai có thể thay đổi tác động của việc tối ưu hóa

  • Một chương trình không chạy nhanh hơn khi nó được đọc từ tệp

    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    55 so với khi nó được đọc từ tệp
    >>> fibo.fib[1000]
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
    >>> fibo.fib2[100]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    >>> fibo.__name__
    'fibo'
    
    7;

  • Mô-đun

    import folder1.folder2.user     #absolute import
    from folder1.folder2 import user #absolute import
    58 có thể tạo. pyc cho tất cả các mô-đun trong một thư mục

  • Có nhiều chi tiết hơn về quy trình này, bao gồm biểu đồ dòng chảy của các quyết định, trong PEP 3147

6. 2. Mô-đun tiêu chuẩn¶

Python đi kèm với một thư viện gồm các mô-đun tiêu chuẩn, được mô tả trong một tài liệu riêng, Tham khảo thư viện Python [“Tham khảo thư viện” sau đây]. Một số mô-đun được tích hợp vào trình thông dịch; . Tập hợp các mô-đun như vậy là một tùy chọn cấu hình cũng phụ thuộc vào nền tảng cơ bản. Ví dụ: mô-đun

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
59 chỉ được cung cấp trên hệ thống Windows. Một mô-đun cụ thể đáng được chú ý.
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
90, được tích hợp trong mọi trình thông dịch Python. Các biến
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
91 và
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
92 xác định các chuỗi được sử dụng làm lời nhắc chính và phụ

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
02

Hai biến này chỉ được xác định nếu trình thông dịch ở chế độ tương tác

Biến

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
00 là danh sách các chuỗi xác định đường dẫn tìm kiếm của trình thông dịch cho các mô-đun. Nó được khởi tạo thành một đường dẫn mặc định được lấy từ biến môi trường
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
02 hoặc từ một mặc định tích hợp sẵn nếu
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
02 không được đặt. Bạn có thể sửa đổi nó bằng các thao tác danh sách tiêu chuẩn

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
03

6. 3. Hàm
import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
96¶

Hàm tích hợp sẵn

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
96 được sử dụng để tìm ra tên mà một mô-đun xác định. Nó trả về một danh sách các chuỗi được sắp xếp

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
04

Không có đối số,

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
96 liệt kê các tên bạn đã xác định hiện tại

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
05

Lưu ý rằng nó liệt kê tất cả các loại tên. biến, mô-đun, hàm, v.v.

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
96 không liệt kê tên của các hàm và biến tích hợp. Nếu bạn muốn có một danh sách những thứ đó, chúng được xác định trong mô-đun chuẩn
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
20

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
06

6. 4. Gói¶

Các gói là một cách cấu trúc không gian tên mô-đun của Python bằng cách sử dụng “tên mô-đun chấm”. Ví dụ: tên mô-đun

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
21 chỉ định mô-đun con có tên
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
22 trong gói có tên
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
23. Giống như việc sử dụng các mô-đun giúp tác giả của các mô-đun khác nhau không phải lo lắng về tên biến toàn cục của nhau, việc sử dụng tên mô-đun chấm giúp tác giả của các gói đa mô-đun như NumPy hoặc Gối không phải lo lắng về tên mô-đun của nhau

Giả sử bạn muốn thiết kế một tập hợp các mô-đun [một “gói”] để xử lý thống nhất các tệp âm thanh và dữ liệu âm thanh. Có nhiều định dạng tệp âm thanh khác nhau [ví dụ: thường được nhận dạng bằng phần mở rộng của chúng.

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
24,
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
25,
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
26], vì vậy bạn có thể cần tạo và duy trì bộ sưu tập mô-đun ngày càng tăng để chuyển đổi giữa các định dạng tệp khác nhau. Ngoài ra còn có nhiều thao tác khác nhau mà bạn có thể muốn thực hiện trên dữ liệu âm thanh [chẳng hạn như trộn, thêm tiếng vang, áp dụng chức năng bộ chỉnh âm, tạo hiệu ứng âm thanh nổi nhân tạo], vì vậy, ngoài ra, bạn sẽ viết một luồng mô-đun không bao giờ kết thúc để thực hiện . Đây là cấu trúc có thể có cho gói của bạn [được thể hiện dưới dạng hệ thống tệp phân cấp]

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
07

Khi nhập gói, Python tìm kiếm qua các thư mục trên

import folder1.folder2.user     #absolute import
from folder1.folder2 import user #absolute import
00 để tìm thư mục con của gói

Các tệp

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
28 được yêu cầu để Python xử lý các thư mục chứa tệp dưới dạng các gói. Điều này ngăn các thư mục có tên chung, chẳng hạn như
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
29, vô tình ẩn các mô-đun hợp lệ xảy ra sau này trên đường dẫn tìm kiếm mô-đun. Trong trường hợp đơn giản nhất,
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
28 chỉ có thể là một tệp trống, nhưng nó cũng có thể thực thi mã khởi tạo cho gói hoặc đặt biến
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
51, được mô tả sau

Ví dụ: người dùng gói có thể nhập các mô-đun riêng lẻ từ gói

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
08

Điều này tải submodule

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
52. Nó phải được tham chiếu với tên đầy đủ của nó

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
09

Một cách khác để nhập mô hình con là

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
0

Điều này cũng tải mô hình con

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
53 và làm cho nó khả dụng mà không cần tiền tố gói, vì vậy nó có thể được sử dụng như sau

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
1

Tuy nhiên, một biến thể khác là nhập trực tiếp hàm hoặc biến mong muốn

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
2

Một lần nữa, điều này tải mô hình con

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
53, nhưng điều này làm cho chức năng của nó
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
55 có sẵn trực tiếp

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
3

Lưu ý rằng khi sử dụng

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
56, mục có thể là mô hình con [hoặc gói con] của gói hoặc một số tên khác được xác định trong gói, như hàm, lớp hoặc biến. Câu lệnh
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
13 đầu tiên kiểm tra xem mục có được xác định trong gói hay không; . Nếu không tìm thấy nó, một ngoại lệ
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
58 sẽ được đưa ra

Ngược lại, khi sử dụng cú pháp như

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
59, mỗi mục trừ mục cuối cùng phải là một gói;

6. 4. 1. Nhập * Từ Gói¶

Bây giờ điều gì xảy ra khi người dùng viết

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
000? . Quá trình này có thể mất nhiều thời gian và việc nhập mô-đun con có thể có các tác dụng phụ không mong muốn chỉ xảy ra khi mô-đun con được nhập rõ ràng

Giải pháp duy nhất là tác giả gói cung cấp chỉ mục rõ ràng của gói. Câu lệnh

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
13 sử dụng quy ước sau. nếu mã
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
28 của một gói xác định một danh sách có tên là
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
51, thì nó được coi là danh sách các tên mô-đun sẽ được nhập khi gặp phải
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
004. Tác giả gói có nhiệm vụ cập nhật danh sách này khi phiên bản mới của gói được phát hành. Tác giả gói cũng có thể quyết định không hỗ trợ nó, nếu họ không thấy việc sử dụng để nhập * từ gói của họ. Ví dụ: tệp
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
005 có thể chứa đoạn mã sau

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
4

Điều này có nghĩa là

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
000 sẽ nhập ba mô hình con có tên của gói
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
007

Nếu

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
51 không được xác định, câu lệnh
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
000 không nhập tất cả các mô hình con từ gói
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
007 vào không gian tên hiện tại; . Điều này bao gồm bất kỳ tên nào được xác định [và các mô hình con được tải rõ ràng] bởi
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
28. Nó cũng bao gồm bất kỳ mô hình con nào của gói đã được tải rõ ràng bởi các câu lệnh
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
13 trước đó. Hãy xem xét mã này

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
5

Trong ví dụ này, các mô-đun

import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
53 và
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
016 được nhập vào không gian tên hiện tại vì chúng được xác định trong gói
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
007 khi câu lệnh
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
018 được thực thi. [Điều này cũng hoạt động khi
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
51 được xác định. ]

Mặc dù một số mô-đun nhất định được thiết kế để chỉ xuất các tên tuân theo các mẫu nhất định khi bạn sử dụng

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
020, nhưng đây vẫn được coi là thông lệ không tốt trong mã sản xuất

Hãy nhớ rằng, không có gì sai khi sử dụng

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
021. Trên thực tế, đây là ký hiệu được khuyến nghị trừ khi mô-đun nhập cần sử dụng các mô-đun con có cùng tên từ các gói khác nhau

6. 4. 2. Tham chiếu trong gói¶

Khi các gói được cấu trúc thành các gói con [như với gói

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
022 trong ví dụ], bạn có thể sử dụng nhập khẩu tuyệt đối để chỉ các mô-đun con của các gói anh chị em. Ví dụ: nếu mô-đun
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
023 cần sử dụng mô-đun
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
53 trong gói
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
007, thì nó có thể sử dụng
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
026

Bạn cũng có thể viết nhập khẩu tương đối, với mẫu báo cáo nhập khẩu

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
027. Các lần nhập này sử dụng các dấu chấm ở đầu để biểu thị các gói hiện tại và gói gốc liên quan đến quá trình nhập tương đối. Ví dụ, từ mô-đun
import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
016, bạn có thể sử dụng

>>> fibo.fib[1000]
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2[100]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
6

Lưu ý rằng nhập tương đối dựa trên tên của mô-đun hiện tại. Vì tên của mô-đun chính luôn là

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
86, nên các mô-đun được sử dụng làm mô-đun chính của ứng dụng Python phải luôn sử dụng nhập khẩu tuyệt đối

6. 4. 3. Gói trong nhiều thư mục¶

Các gói hỗ trợ thêm một thuộc tính đặc biệt,

import subfolder1.item    #absolute import
from subfolder1 import item  #absolute import
030. Điều này được khởi tạo để trở thành một danh sách chứa tên của thư mục chứa gói
import myPackage.security #absolute import
from myPackage import security #absolute import
from .. import security #relative import
28 trước khi mã trong tệp đó được thực thi. Biến này có thể được sửa đổi;

Mặc dù tính năng này thường không cần thiết, nhưng nó có thể được sử dụng để mở rộng tập hợp các mô-đun được tìm thấy trong một gói

chú thích

1

Trên thực tế, các định nghĩa hàm cũng là 'các câu lệnh' được 'thực thi';

Có bao nhiêu mô-đun nhập trong Python?

Chúng tôi có thể nhập một mô-đun hai lần không?

Có, bạn có thể nhập một lớp hai lần trong Java, nó không tạo ra bất kỳ sự cố nào, nhưng bất kể số lần bạn nhập, JVM chỉ tải lớp một lần

Điều gì xảy ra nếu bạn nhập một mô-đun hai lần?

Nếu nhiều mô-đun nhập cùng một mô-đun thì angular chỉ đánh giá mô-đun đó một lần [Khi gặp mô-đun lần đầu tiên]. Nó tuân theo điều kiện này ngay cả khi mô-đun xuất hiện ở bất kỳ cấp độ nào trong hệ thống phân cấp NgModules đã nhập.

Bạn có thể nhập nhiều thư viện trong một dòng Python không?

Pyforest thực hiện công việc đó cho bạn bằng cách tự động nhập các thư viện bạn muốn sử dụng cho nghiên cứu điển hình của mình . Khi bạn nhập thư viện pyforest trong một dòng, bây giờ bạn có thể sử dụng tất cả các thư viện python như thư viện thường làm.

Chủ Đề