Hướng dẫn structure of python module - cấu trúc của mô-đun python
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 đã thực hiện (chức năng 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, 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 lâu hơn, bạn có thể muốn chia nó thành một số 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 sao chép định nghĩa của nó vào từng chương trình. Show
Để hỗ trợ điều này, Python có một cách để đặt 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 trường hợp tương tác của trình thông dịch. Một tập tin như vậy được gọi là một mô -đun; Các định nghĩa từ một mô -đun có thể được nhập vào các mô -đun khác hoặc vào mô -đun chính (bộ sưu tập các biến mà bạn có quyền truy cập trong tập lệnh được thực thi ở cấp cao nhất và ở chế độ máy tính). 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 với hậu tố >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3775 được nối thêm. Trong một mô -đun, tên mô -đun (dưới dạng chuỗi) có sẵn dưới dạng giá trị của biến toàn cầu >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776. 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 một tệp có tên >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3777 trong thư mục hiện tại với các nội dung sau: # Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result Bây giờ nhập trình thông dịch Python và nhập mô -đun này bằng lệnh sau: Điều này không thêm tên của các hàm được xác định trong >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 trực tiếp vào không gian tên hiện tại (xem phạm vi Python và không gian tên để biết thêm chi tiết); Nó chỉ thêm tên mô -đun >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 ở đó. Sử dụng tên mô -đun, bạn có thể truy cập các chức năng:namespace (see Python Scopes and Namespaces for more details); it only adds the module name >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 there. Using the module name you can access the functions: >>> 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 cục bộ: >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 6.1. Thêm về các mô -đunMore on Modules¶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 chức năng. Các câu lệnh này được dự định để khởi tạo mô -đun. Chúng chỉ được thực thi ngay lần đầu tiên tên mô -đun gặp trong một 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 sử dụng làm không gian tên toàn cầu bởi tất cả các hàm đượ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ầu trong mô -đun mà không phải lo lắng về các cuộc đụng độ tình cờ với các biến toàn cầu của người dùng. Mặt khác, nếu bạn biết những gì bạn đang làm, bạn có thể chạm vào các biến toàn cầu 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ó, >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770. Các mô -đun có thể nhập các mô -đun khác. Đó là thông lệ nhưng không bắt buộc phải đặt tất cả các câu lệnh >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3771 ở đầu một mô -đun (hoặc tập lệnh, cho vấn đề đó). Các tên mô -đun đã nhập, nếu được đặt ở cấp cao nhất của một 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 toàn cầu của mô -đun. Có một biến thể của câu lệnh >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3771 nhập tên từ một mô -đun trực tiếp vào không gian tên mô -đun nhập mô -đun. Ví dụ: >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Điều này không giới thiệu tên mô -đun mà từ đó nhập khẩu được thực hiện trong không gian tên cục bộ (vì vậy trong ví dụ, >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 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ột mô -đun xác định: >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Điều này nhập tất cả các tên ngoại trừ các tên bắt đầu bằng dấu gạch dưới ( >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3774). 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 cơ sở 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ể che giấu một số điều bạn đã xác định. Lưu ý rằng nói chung, thực tiễn nhập >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3775 từ một mô -đun hoặc gói được cau mày, vì nó thường gây ra mã có thể đọc được kém. Tuy nhiên, việc sử dụng nó là ổn để lưu gõ trong các phiên tương tác. Nếu tên mô -đun được theo sau bởi >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776, thì tên sau >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776 sẽ được liên kết trực tiếp với mô -đun đã nhập. >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Điều này là nhập hiệu quả mô -đun theo cùng một cách mà >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 sẽ làm, với sự khác biệt duy nhất của nó có sẵn là >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3779. Nó cũng có thể được sử dụng khi sử dụng >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770 với các hiệu ứng tương tự: >>> from fibo import fib as fibonacci >>> fibonacci(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 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 nó chỉ là một mô -đun bạn muốn kiểm tra tương tác, hãy sử dụng >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3771, ví dụ: >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3772. 6.1.1. Thực hiện các mô -đun dưới dạng tập lệnhExecuting modules as scripts¶Khi bạn chạy một mô -đun Python với python fibo.py <arguments> Mã trong mô -đun sẽ được thực thi, giống như khi bạn nhập nó, nhưng với >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776 được đặt thành >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3774. Đ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: if __name__ == "__main__": import sys fib(int(sys.argv[1])) 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ột mô -đun có thể nhập, bởi vì mã phân tích dòng lệnh chỉ chạy nếu mô -đun được thực thi dưới dạng tệp chính của Hồi giáo: $ python fibo.py 50 0 1 1 2 3 5 8 13 21 34 Nếu mô -đun được nhập, mã không được chạy: Đ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ột 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ô -đunThe Module Search Path¶Khi một mô-đun có tên >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3775 được nhập, trình thông dịch trước tiên tìm kiếm một mô-đun tích hợp với tên đó. Các tên mô -đun này được liệt kê trong >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776. Nếu không tìm thấy, sau đó nó sẽ tìm kiếm một tệp có tên >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3777 trong danh sách các thư mục được đưa ra bởi biến >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778. >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 được khởi tạo từ các vị trí này:
Thêm chi tiết là khởi tạo của đường dẫn tìm kiếm mô -đun sys.path.The initialization of the sys.path module search path. Ghi chú Trên các hệ thống tệp hỗ trợ Symlinks, thư mục chứa tập lệnh đầu vào được tính toán sau khi liên kết symlink được theo dõi. Nói cách khác, thư mục chứa SymLink không được thêm vào đường dẫn tìm kiếm mô -đun.not added to the module search path. Sau khi khởi tạo, các chương trình Python có thể sửa đổi >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778. Thư mục chứa tập lệnh được chạy được đặt ở đầu đường tìm kiếm, trước đường dẫn thư viện tiêu 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.Standard Modules for more information. 6.1.3. Các tập tin của Python đã biên dịch“Compiled” Python files¶Để tăng tốc các mô -đun tải, Python lưu trữ phiên bản biên dịch của mỗi mô -đun trong thư mục >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3775 dưới tên >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3776, trong đó phiên bản mã hóa định dạng của tệp được biên dịch; Nó thường chứa số phiên bản Python. Ví dụ: trong CPYThon Release 3.3, phiên bản biên dịch của spam.py sẽ được lưu trữ là >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3777. 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 khác nhau của Python để 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 được biên dịch để xem liệu nó có lỗi thời hay không và cần phải được biên dịch lại. Đâ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 không phụ thuộc vào nền tảng, vì vậy cùng một thư viện có thể được chia sẻ giữa các hệ thống với cá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 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 nguồn (chỉ được biên dịch), mô-đun được 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ố mẹo cho các chuyên gia:
6.2. Mô -đun tiêu chuẩnStandard Modules¶Python đi kèm với một thư viện các mô -đun tiêu chuẩn, được mô tả trong một tài liệu riêng biệt, tài liệu tham khảo thư viện Python (Tài liệu tham khảo thư viện của Hồi giáo sau đây). Một số mô -đun được xây dựng vào thông dịch viên; Chúng cung cấp quyền truy cập vào các hoạt động không phải là một phần cốt lõi của ngôn ngữ nhưng vẫn được tích hợp, cho hiệu quả hoặc cung cấp quyền truy cập vào các nguyên thủy hệ điều hành như các cuộc gọi hệ thống. 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 >>> from fibo import fib as fibonacci >>> fibonacci(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3777 chỉ được cung cấp trên các hệ thống Windows. Một mô -đun cụ thể xứng đáng được chú ý: >>> from fibo import fib as fibonacci >>> fibonacci(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778, được xây dựng thành mọi phiên dịch viên Python. Các biến >>> from fibo import fib as fibonacci >>> fibonacci(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3779 và python fibo.py <arguments>0 Xác định các chuỗi được sử dụng làm lời nhắc chính và phụ: >>> 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 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 >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3778 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 fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770 hoặc từ mặc định tích hợp nếu >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770 không được đặt. Bạn có thể sửa đổi nó bằng cách sử dụng các hoạt động danh sách tiêu chuẩn: >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770, or from a built-in default if >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 3770 is not set. You can modify it using standard list operations: >>> 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 6.3. Hàm python fibo.py |