Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?
Trong Python, bạn sử dụng từ khóa 34 để làm mã trong một mô -đun có sẵn trong một mô -đun khác. Nhập khẩu trong Python rất quan trọng để cấu trúc mã của bạn một cách hiệu quả. Sử dụng nhập khẩu đúng cách sẽ giúp bạn làm việc hiệu quả hơn, cho phép bạn sử dụng lại mã trong khi giữ cho các dự án của bạn có thể duy trì. 34 keyword to make code in one module available in another. Imports in Python are important for structuring your code effectively. Using imports properly will make you more productive, allowing you to reuse code while keeping your projects maintainable. Show
Hướng dẫn này sẽ cung cấp một cái nhìn tổng quan kỹ lưỡng về tuyên bố của Python, 34 và cách thức hoạt động. Hệ thống nhập khẩu rất mạnh mẽ và bạn sẽ học cách khai thác sức mạnh này. Trong khi bạn bao gồm nhiều khái niệm đằng sau hệ thống nhập khẩu Python, nhưng hướng dẫn này chủ yếu là ví dụ được điều khiển. Bạn sẽ học hỏi từ một số ví dụ mã trong suốt.Trong hướng dẫn này, bạn sẽ học cách:
Trong suốt hướng dẫn, bạn sẽ thấy các ví dụ về cách chơi với máy móc nhập Python để hoạt động hiệu quả nhất. Mặc dù tất cả các mã được hiển thị trong hướng dẫn, bạn cũng có thể tải xuống bằng cách nhấp vào hộp bên dưới: Python cơ bản >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 34Mã Python được tổ chức thành cả hai mô -đun và gói. Phần này sẽ giải thích cách chúng khác nhau và cách bạn có thể làm việc với họ. Sau đó trong hướng dẫn, bạn sẽ thấy một số cách sử dụng nâng cao và ít được biết đến của hệ thống nhập khẩu Python. Tuy nhiên, hãy để bắt đầu với những điều cơ bản: nhập các mô -đun và gói. Mô -đunThuật ngữ python.org định nghĩa mô -đun như sau:module as follows:
Trong thực tế, một mô -đun thường tương ứng với một tệp 37 chứa mã Python.Sức mạnh thực sự của các mô -đun là chúng có thể được nhập và sử dụng lại trong mã khác. Xem xét ví dụ sau: >>>
Trong dòng đầu tiên, 38, bạn nhập mã trong mô -đun 39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến 40 trong mô -đun 39. 39 là một phần của thư viện tiêu chuẩn Python, điều đó có nghĩa là nó luôn luôn có sẵn để nhập khi bạn chạy Python.Lưu ý rằng bạn viết 43 và không chỉ đơn giản là 40. Ngoài việc là một mô -đun, 39 hoạt động như một không gian tên giữ tất cả các thuộc tính của mô -đun lại với nhau. Không gian tên rất hữu ích để giữ mã của bạn có thể đọc được và tổ chức. Theo lời của Tim Peters:namespace that keeps all the attributes of the module together. Namespaces are useful for keeping your code readable and organized. In the words of Tim Peters:
Bạn có thể liệt kê nội dung của không gian tên với 46:
>>>
Trong dòng đầu tiên, 38, bạn nhập mã trong mô -đun 39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến 40 trong mô -đun 39. 39 là một phần của thư viện tiêu chuẩn Python, điều đó có nghĩa là nó luôn luôn có sẵn để nhập khi bạn chạy Python.Lưu ý rằng bạn viết 43 và không chỉ đơn giản là 40. Ngoài việc là một mô -đun, 39 hoạt động như một không gian tên giữ tất cả các thuộc tính của mô -đun lại với nhau. Không gian tên rất hữu ích để giữ mã của bạn có thể đọc được và tổ chức. Theo lời của Tim Peters:Không gian tên là một trong những ý tưởng tuyệt vời, hãy để làm nhiều hơn những người đó! (Nguồn) >>>
Trong dòng đầu tiên, 38, bạn nhập mã trong mô -đun 39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến 40 trong mô -đun 39. 39 là một phần của thư viện tiêu chuẩn Python, điều đó có nghĩa là nó luôn luôn có sẵn để nhập khi bạn chạy Python.Lưu ý rằng bạn viết 43 và không chỉ đơn giản là 40. Ngoài việc là một mô -đun, 39 hoạt động như một không gian tên giữ tất cả các thuộc tính của mô -đun lại với nhau. Không gian tên rất hữu ích để giữ mã của bạn có thể đọc được và tổ chức. Theo lời của Tim Peters:>>>
Trong dòng đầu tiên, 38, bạn nhập mã trong mô -đun 39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến 40 trong mô -đun 39. 39 là một phần của thư viện tiêu chuẩn Python, điều đó có nghĩa là nó luôn luôn có sẵn để nhập khi bạn chạy Python.Lưu ý rằng bạn viết >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 43 và không chỉ đơn giản là >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 40. Ngoài việc là một mô -đun, >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 39 hoạt động như một không gian tên giữ tất cả các thuộc tính của mô -đun lại với nhau. Không gian tên rất hữu ích để giữ mã của bạn có thể đọc được và tổ chức. Theo lời của Tim Peters:Không gian tên là một trong những ý tưởng tuyệt vời, hãy để làm nhiều hơn những người đó! (Nguồn)package as follows:
Sử dụng 46 mà không có bất kỳ đối số nào cho thấy những gì trong không gian tên toàn cầu. Để xem nội dung của không gian tên 39, bạn sử dụng 49.Bạn đã thấy việc sử dụng 34 đơn giản nhất. Tuy nhiên, có nhiều cách khác để sử dụng nó cho phép bạn nhập các phần cụ thể của mô -đun và đổi tên mô -đun khi bạn nhập nó.Mã sau chỉ nhập biến 40 từ mô -đun 39:
Lưu ý rằng điều này đặt 40 trong không gian tên toàn cầu và không nằm trong không gian tên 39.
Lưu ý rằng 61 chỉ nhập 62 chứ không phải 63. Tương tự, 64 không nhập bất cứ thứ gì, trong khi 65 nhập 66 và 67 nhưng không phải 68. Mỗi mô -đun quốc gia sẽ in một lời chào khi nó nhập khẩu.Hãy cùng chơi với gói 69 tại dấu nhắc tương tác để hiểu rõ hơn về cách thức hoạt động của SubPackages và Submodules:>>>
Khi 63 được nhập, các mô -đun 71 và 72 cũng được nhập. Bạn có thể thấy điều này bởi vì các mô -đun quốc gia in một lời chào khi họ nhập khẩu:>>>
Khi 63 được nhập, các mô -đun 71 và 72 cũng được nhập. Bạn có thể thấy điều này bởi vì các mô -đun quốc gia in một lời chào khi họ nhập khẩu:>>>
Khi 63 được nhập, các mô -đun 71 và 72 cũng được nhập. Bạn có thể thấy điều này bởi vì các mô -đun quốc gia in một lời chào khi họ nhập khẩu:Tệp 64 trống. Điều này có nghĩa là nhập gói 74 tạo ra không gian tên nhưng không có tác dụng khác:Hãy nhớ rằng, nhập một mô -đun cả hai tải nội dung và tạo một không gian tên chứa nội dung. Một vài ví dụ cuối cùng cho thấy rằng nó có thể cho cùng một mô -đun là một phần của các không gian tên khác nhau.Nó khá phổ biến để nhập các thanh toán con và phân nhóm trong tệp 56 để giúp chúng có sẵn hơn cho người dùng của bạn. Bạn có thể thấy một ví dụ về điều này trong gói 76 phổ biến.Nhập khẩu tuyệt đối và tương đối Nhớ lại mã nguồn của 61 trong ví dụ trước:relative import. You can read it as “From the current package, import the subpackage 62.”Bạn đã thấy các câu 78 như 79, nhưng dấu chấm ( 80) trong 81 có nghĩa là gì?absolute import statement in which you explicitly name the current package:DOT đề cập đến gói hiện tại và câu lệnh là một ví dụ về nhập khẩu tương đối. Bạn có thể đọc nó như là từ gói hiện tại, nhập gói con 62.Có một câu lệnh nhập khẩu tuyệt đối tương đương trong đó bạn đặt tên rõ ràng gói hiện tại: Trên thực tế, tất cả các nhập khẩu trong 69 có thể đã được thực hiện rõ ràng với các nhập khẩu tuyệt đối tương tự.Nhập khẩu tương đối phải ở dạng >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 78 và vị trí mà bạn nhập từ phải bắt đầu bằng một dấu chấm.Hướng dẫn kiểu PEP 8 khuyến nghị sử dụng nhập khẩu tuyệt đối nói chung. Tuy nhiên, nhập khẩu tương đối là một giải pháp thay thế để tổ chức phân cấp gói. Để biết thêm thông tin, hãy xem nhập khẩu tuyệt đối so với nhập khẩu tương đối trong Python.import path. This is a list of locations that are searched for modules to import. Đường dẫn nhập khẩu Python
Nội dung của biến môi trường 86
Các thư mục phụ thuộc vào cài đặt khácshadow, or hide, other important modules. As an example, say that you define the following 39 module:
Thông thường, Python sẽ bắt đầu ở đầu danh sách các vị trí và tìm kiếm một mô -đun nhất định ở mỗi vị trí cho đến khi trận đấu đầu tiên. Vì thư mục tập lệnh hoặc thư mục hiện tại luôn là người đầu tiên trong danh sách này, bạn có thể đảm bảo rằng các tập lệnh của bạn tìm thấy các mô-đun và gói tự lập của bạn bằng cách tổ chức các thư mục của bạn và cẩn thận về thư mục bạn chạy Python từ đó. >>> 0Tuy nhiên, bạn cũng nên cẩn thận rằng bạn không tạo ra các mô -đun mà bóng, hoặc ẩn, các mô -đun quan trọng khác. Ví dụ, hãy nói rằng bạn xác định mô -đun 39 sau:>>> 1Sử dụng mô -đun này hoạt động như mong đợi: Nhưng mô -đun này cũng bóng tối mô -đun 39 mà LỚN bao gồm trong thư viện tiêu chuẩn. Thật không may, điều đó có nghĩa là ví dụ trước đây của chúng tôi về việc tìm kiếm giá trị của π không còn hoạt động:Vấn đề là Python hiện đang tìm kiếm mô -đun >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 39 mới của bạn cho >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 40 thay vì tìm kiếm mô -đun >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 39 trong thư viện tiêu chuẩn.Để tránh các loại vấn đề này, bạn nên cẩn thận với tên của các mô -đun và gói của bạn. Cụ thể, mô-đun cấp cao nhất của bạn và tên gói phải là duy nhất. Nếu 39 được định nghĩa là một mô hình con trong một gói, thì nó đã giành được bóng tối mô-đun tích hợp. 2Ví dụ: Cấu trúc nhập khẩu của bạn 3Hai tệp mã nguồn cũng như tệp 98 được tạo tự động được tạo lại bên trong một thư mục mới có tên 99.Bây giờ hãy xem mã nguồn. Chức năng chính của ứng dụng được xác định trong 95: 4Trong các dòng 12 đến 16, bạn đọc một đường dẫn gốc từ dòng lệnh. Trong ví dụ trên, bạn sử dụng một dấu chấm, có nghĩa là thư mục hiện tại. Đường dẫn này sẽ được sử dụng làm 01 của phân cấp tệp mà bạn sẽ tạo lại.lines 12 to 16, you read a root path from the command line. In the above example you use a dot, which means the current directory. This path will be used as the 01 of the file hierarchy that you’ll re-create.Công việc thực tế xảy ra trong các dòng 19 đến 23. Đầu tiên, bạn tạo một đường dẫn duy nhất, 02, đó sẽ là gốc của hệ thống phân cấp tệp mới của bạn. Sau đó, bạn lặp qua tất cả các đường dẫn bên dưới 01 gốc và tạo lại chúng dưới dạng các tệp trống bên trong hệ thống phân cấp tệp mới.lines 19 to 23. First, you create a unique path, 02, that
will be the root of your new file hierarchy. Then you loop through all paths below the original 01 and re-create them as empty files inside the new file hierarchy. Đối với các đường dẫn thao tác như thế này, 04 trong thư viện tiêu chuẩn là khá hữu ích. Để biết thêm chi tiết về cách sử dụng của nó, hãy xem mô -đun Python 3, ____ ____204: Taming hệ thống tệp.Trên dòng 26, bạn gọi 06. Bạn sẽ tìm hiểu thêm về bài kiểm tra 07 trên dòng 25 sau. Hiện tại, bạn nên biết rằng biến đặc biệt 08 có giá trị 09 bên trong các tập lệnh, nhưng nó có tên của mô -đun bên trong các mô -đun đã nhập. Để biết thêm thông tin về 08, hãy xem xác định các chức năng chính trong Python và nếu tên == Main chính làm trong Python ?.line 26, you call 06. You’ll learn more
about the 07 test on line 25 later. For now, you should know that the special variable 08 has the value 09 inside scripts, but it gets the name of the module inside imported modules. For more information on 08, check out Defining Main
Functions in Python and What Does if name == “main” Do in Python?.Lưu ý rằng bạn nhập 11 trên dòng 8. Mô -đun thư viện này chứa hai chức năng tiện ích:line 8. This library module contains two utility functions: 5 12 sử dụng một bộ đếm để tìm một đường dẫn không tồn tại. Trong ứng dụng, bạn sử dụng nó để tìm một thư mục con độc đáo để sử dụng làm 02 của phân cấp tệp được tạo lại. Tiếp theo, 14 đảm bảo tất cả các thư mục cần thiết được tạo trước khi tạo một tệp trống bằng 15.Hãy xem lại việc nhập 11 một lần nữa: 6Nó trông khá ngây thơ. Tuy nhiên, khi dự án phát triển, dòng này sẽ khiến bạn đau đầu. Mặc dù bạn nhập 11 từ dự án 97, việc nhập khẩu là tuyệt đối: nó không bắt đầu với một dấu chấm. Điều này có nghĩa là 11 phải được tìm thấy trong đường dẫn nhập để nhập hoạt động.absolute: it doesn’t start with a dot. This means that 11 must be found in the import path for the import to work. May mắn thay, thư mục chứa tập lệnh hiện tại luôn nằm trong đường dẫn nhập Python, vì vậy điều này hoạt động tốt cho đến bây giờ. Tuy nhiên, nếu dự án của bạn đạt được một số lực kéo, thì nó có thể được sử dụng theo những cách khác. Ví dụ, ai đó có thể muốn nhập tập lệnh vào sổ ghi chép Jupyter và chạy nó từ đó. Hoặc họ có thể muốn sử dụng lại thư viện 11 trong một dự án khác. Họ thậm chí có thể tạo ra một thực thi với pyinstaller để dễ dàng phân phối nó hơn. Thật không may, bất kỳ kịch bản nào trong số này có thể tạo ra các vấn đề với việc nhập 11.Để xem một ví dụ, bạn có thể làm theo hướng dẫn của PyInstaller và tạo một điểm nhập vào ứng dụng của bạn. Thêm một thư mục bổ sung bên ngoài thư mục ứng dụng của bạn: 7Trong thư mục bên ngoài, tạo tập lệnh điểm nhập, 22: 8Tập lệnh này sẽ nhập 06 từ tập lệnh gốc của bạn và chạy nó. Lưu ý rằng 06 là chạy khi 97 được nhập khẩu do thử nghiệm 07 trên dòng 25 trong 95. Điều đó có nghĩa là bạn cần chạy 06 một cách rõ ràng.line 25 in
95. That means you need to run 06 explicitly.Về lý thuyết, điều này sẽ hoạt động tương tự như chạy ứng dụng trực tiếp: 9Tại sao không làm việc đó? Đột nhiên, việc nhập 11 gây ra lỗi.Vấn đề là bằng cách bắt đầu ứng dụng với 22, bạn đã thay đổi vị trí của tập lệnh hiện tại, từ đó thay đổi đường dẫn nhập. 11 không còn trên đường nhập khẩu, vì vậy nó có thể được nhập khẩu hoàn toàn.Một giải pháp khả thi là thay đổi đường dẫn nhập Python: 0Điều này hoạt động vì đường dẫn nhập bao gồm thư mục chứa 95 và 96. Vấn đề với phương pháp này là đường dẫn nhập khẩu của bạn có thể rất lộn xộn và khó hiểu.Trong thực tế, bạn đã tạo lại một tính năng của các phiên bản Python đầu tiên được gọi là nhập khẩu tương đối ngầm. Những thứ này đã bị xóa khỏi ngôn ngữ bởi PEP 328 với lý do sau:implicit relative imports. These were removed from the language by PEP 328 with the following rationale:
Một giải pháp khác là sử dụng nhập khẩu tương đối thay thế. Thay đổi nhập trong 95 như sau: 1Bây giờ bạn có thể khởi động ứng dụng của mình thông qua tập lệnh điểm nhập: 2Thật không may, bạn không còn có thể gọi ứng dụng trực tiếp: 3Vấn đề là nhập khẩu tương đối được giải quyết khác nhau trong các tập lệnh so với các mô -đun nhập khẩu. Tất nhiên, bạn có thể quay lại và khôi phục nhập tuyệt đối trước khi chạy tập lệnh trực tiếp hoặc thậm chí bạn có thể thực hiện một số nhào lộn 36 để nhập tệp hoàn toàn hoặc tương đối phụ thuộc vào những gì hoạt động.Có cả một vụ hack bị xử phạt chính thức để thực hiện nhập khẩu tương đối hoạt động trong các kịch bản. Thật không may, điều này cũng buộc bạn phải thay đổi 85 trong hầu hết các trường hợp. Để trích dẫn Raymond Hettinger:
Thật vậy, một giải pháp tốt hơn và ổn định hơn là chơi cùng với hệ thống nhập và đóng gói Python, và cài đặt dự án của bạn làm gói địa phương bằng cách sử dụng 38.Tạo và cài đặt gói cục bộKhi bạn cài đặt gói từ PYPI, gói đó có sẵn cho tất cả các tập lệnh trong môi trường của bạn. Tuy nhiên, bạn cũng có thể cài đặt các gói từ máy tính cục bộ của mình và chúng cũng sẽ được cung cấp theo cùng một cách. Tạo một gói địa phương không liên quan đến nhiều chi phí. Đầu tiên, hãy tạo các tệp 39 và 40 tối thiểu trong thư mục 97 bên ngoài: 4Về lý thuyết, 42 và 43 có thể là bất cứ điều gì bạn thích. Tuy nhiên, chúng sẽ được sử dụng bởi 38 khi đề cập đến gói của bạn, vì vậy bạn nên chọn các giá trị có thể nhận ra và don don va chạm với các gói khác mà bạn sử dụng.Một mẹo là cung cấp cho tất cả các gói địa phương như vậy một tiền tố phổ biến như 45 hoặc tên người dùng của bạn. 46 nên liệt kê thư mục hoặc thư mục chứa mã nguồn của bạn. Sau đó, bạn có thể cài đặt gói cục bộ bằng cách sử dụng 38: 5Lệnh này sẽ cài đặt gói vào hệ thống của bạn. 97 Sau đó sẽ được tìm thấy trên đường dẫn nhập Python, có nghĩa là bạn có thể sử dụng nó ở bất cứ đâu mà không phải lo lắng về thư mục tập lệnh, nhập khẩu tương đối hoặc các biến chứng khác. Tùy chọn 49 là viết tắt của chỉnh sửa, điều này rất quan trọng vì nó cho phép bạn thay đổi mã nguồn của gói mà không cần cài đặt lại.editable, which is important because it allows you to change the source code of your package without reinstalling it.Bây giờ 97 đã được cài đặt trên hệ thống của bạn, bạn có thể sử dụng câu lệnh nhập sau: 6Điều này sẽ hoạt động cho dù bạn cuối cùng gọi ứng dụng của mình như thế nào. Mặc dù nó là một ý tưởng tốt để phân tách các tập lệnh và thư viện, tất cả các tệp Python có thể được thực thi và nhập. Trong phần sau, bạn sẽ tìm hiểu thêm về cách tạo các mô -đun xử lý tốt cả hai. Gói không gian tênCác mô -đun và gói Python có liên quan rất chặt chẽ với các tập tin và thư mục. Điều này làm cho Python khác biệt với nhiều ngôn ngữ lập trình khác trong đó các gói chỉ đóng vai trò là không gian tên mà không thực thi cách tổ chức mã nguồn. Xem các cuộc thảo luận trong PEP 402 để biết ví dụ. Các gói không gian tên đã có sẵn trong Python kể từ phiên bản 3.3. Đây là ít phụ thuộc vào hệ thống phân cấp tệp cơ bản. Cụ thể, các gói không gian tên có thể được chia trên nhiều thư mục. Gói không gian tên được tạo tự động nếu bạn có thư mục chứa tệp 37 file but no 56. See PEP 420 for a detailed explanation.Để hiểu rõ hơn về lý do tại sao các gói không gian tên có thể hữu ích, hãy để cố gắng thực hiện một gói. Như một ví dụ thúc đẩy, bạn sẽ có một vấn đề khác được giải quyết trong mẫu phương thức nhà máy và việc triển khai nó trong Python: đưa ra một đối tượng 53, bạn muốn chuyển đổi nó thành một trong một số biểu diễn chuỗi. Nói cách khác, bạn muốn tuần tự hóa các đối tượng 53.serialize 53 objects.Để cụ thể hơn, bạn muốn triển khai mã hoạt động như thế này: >>> 7Hãy giả sử rằng bạn đã may mắn và bắt gặp việc thực hiện bên thứ ba của một số định dạng mà bạn cần để tuần tự hóa và nó được tổ chức như một gói không gian tên: 8Tệp 55 chứa mã có thể tuần tự hóa một đối tượng vào định dạng JSON: 9Giao diện serializer này có giới hạn một chút, nhưng nó sẽ đủ để chứng minh các gói không gian tên hoạt động như thế nào. Tệp 56 chứa một 57 tương tự có thể chuyển đổi một đối tượng thành XML: 0Lưu ý rằng cả hai lớp này đều thực hiện cùng một giao diện với các phương thức 58, 59 và 60.
Sau đó, bạn tạo một lớp 53 có thể sử dụng các serializer sau: 1Một 53 được xác định bởi ID, tiêu đề và nghệ sĩ của nó. Lưu ý rằng 63 không cần biết định dạng nào mà nó chuyển đổi vì nó sử dụng giao diện chung được xác định trước đó.Giả sử rằng bạn đã cài đặt gói 64 của bên thứ ba, bạn có thể sử dụng nó như sau:>>> 2Bằng cách cung cấp các đối tượng serializer khác nhau cho 63, bạn sẽ nhận được các biểu diễn khác nhau của bài hát của mình.Càng xa càng tốt. Tuy nhiên, bây giờ bạn nhận ra rằng bạn cũng cần chuyển đổi các bài hát của mình thành biểu diễn YAML, không được hỗ trợ trong thư viện của bên thứ ba. Nhập các gói phép thuật của không gian tên: Bạn có thể thêm 66 của riêng mình vào gói 64 mà không cần chạm vào thư viện của bên thứ ba.Đầu tiên, hãy tạo một thư mục trên hệ thống tệp cục bộ của bạn có tên là 64. Điều quan trọng là tên của thư mục phù hợp với tên của gói không gian tên mà bạn đang tùy chỉnh: 3Trong tệp 69, bạn xác định 66 của riêng bạn. Bạn dựa trên gói 71, phải được cài đặt từ PYPI: 4Vì YAML và JSON là các định dạng khá giống nhau, bạn có thể sử dụng lại hầu hết việc triển khai 72: 5
Lưu ý rằng 66 dựa trên 72, được nhập từ chính 64. Vì cả 76 và 77 là một phần của cùng một gói không gian tên, bạn thậm chí có thể sử dụng nhập tương đối: 78.Tiếp tục ví dụ trên, bây giờ bạn cũng có thể chuyển đổi bài hát thành YAML: >>> 6Giống như các mô -đun và gói thông thường, các gói không gian tên phải được tìm thấy trên đường dẫn nhập Python. Nếu bạn theo dõi cùng với các ví dụ trước, thì bạn có thể gặp vấn đề với Python không tìm thấy 64. Trong mã thực tế, bạn đã sử dụng 38 để cài đặt thư viện của bên thứ ba, vì vậy nó sẽ tự động trong đường dẫn của bạn.Bạn cũng nên đảm bảo rằng thư viện địa phương của bạn có sẵn như một gói thông thường. Như đã giải thích ở trên, bạn có thể làm điều này bằng cách chạy Python từ thư mục thích hợp hoặc bằng cách sử dụng 38 để cài đặt thư viện cục bộ.Trong ví dụ này, bạn đã thử nghiệm cách tích hợp gói bên thứ ba giả với gói địa phương của bạn. Nếu 82 là một gói thực sự, thì bạn sẽ tải xuống từ PYPI bằng 38. Vì điều này là có thể, bạn có thể mô phỏng nó bằng cách cài đặt 82 cục bộ như bạn đã làm trong ví dụ 97 trước đó.Ngoài ra, bạn có thể gây rối với đường dẫn nhập của bạn. Đặt các thư mục 82 và 87 bên trong cùng một thư mục, sau đó tùy chỉnh đường dẫn Python của bạn như sau:>>> 7Giống như các mô -đun và gói thông thường, các gói không gian tên phải được tìm thấy trên đường dẫn nhập Python. Nếu bạn theo dõi cùng với các ví dụ trước, thì bạn có thể gặp vấn đề với Python không tìm thấy 64. Trong mã thực tế, bạn đã sử dụng 38 để cài đặt thư viện của bên thứ ba, vì vậy nó sẽ tự động trong đường dẫn của bạn.Bạn cũng nên đảm bảo rằng thư viện địa phương của bạn có sẵn như một gói thông thường. Như đã giải thích ở trên, bạn có thể làm điều này bằng cách chạy Python từ thư mục thích hợp hoặc bằng cách sử dụng >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 38 để cài đặt thư viện cục bộ.Trong ví dụ này, bạn đã thử nghiệm cách tích hợp gói bên thứ ba giả với gói địa phương của bạn. Nếu 82 là một gói thực sự, thì bạn sẽ tải xuống từ PYPI bằng 38. Vì điều này là có thể, bạn có thể mô phỏng nó bằng cách cài đặt 82 cục bộ như bạn đã làm trong ví dụ 97 trước đó.
Tổ chức nhập khẩu vào các nhóm: Nhập thư viện tiêu chuẩn đầu tiên, sau đó nhập khẩu của bên thứ ba và cuối cùng là ứng dụng hoặc nhập thư viện cục bộ. Đặt hàng nhập khẩu theo thứ tự bảng chữ cái trong mỗi nhóm. 8Thích nhập khẩu tuyệt đối hơn nhập khẩu tương đối. Tránh nhập khẩu ký tự đại diện như 88.>>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 89 và >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 90 là những công cụ tuyệt vời để thực thi một phong cách nhất quán trên nhập khẩu của bạn.Dưới đây, một ví dụ về phần nhập khẩu bên trong gói đầu đọc nguồn cấp dữ liệu thực sự: Lưu ý cách nhóm này làm cho các phụ thuộc của mô -đun này rõ ràng: 91 và 92 cần được cài đặt trên hệ thống. Bạn thường có thể cho rằng thư viện tiêu chuẩn có sẵn. Việc phân tách nhập từ bên trong gói của bạn cung cấp cho bạn một số tổng quan về các phụ thuộc nội bộ của mã của bạn.
Đã có một số nỗ lực giải quyết những thách thức này, bao gồm 96. Tuy nhiên, với việc giới thiệu 97 vào thư viện tiêu chuẩn trong Python 3.7, giờ đây, một cách tiêu chuẩn để xử lý các tệp tài nguyên.Giới thiệu >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 97 97 cho phép truy cập vào các tài nguyên trong các gói. Trong bối cảnh này, một tài nguyên là bất kỳ tệp nào nằm trong gói nhập khẩu. Tệp có thể hoặc không thể tương ứng với một tệp vật lý trên hệ thống tệp.resource is any file located within an importable package. The file may or may not correspond to a physical file on the file system. Điều này có một vài lợi thế. Bằng cách sử dụng lại hệ thống nhập, bạn có được cách xử lý nhất quán với các tệp bên trong các gói của bạn. Nó cũng cung cấp cho bạn quyền truy cập dễ dàng hơn vào các tệp tài nguyên trong các gói khác. Tài liệu tổng hợp nó một cách độc đáo:
97 trở thành một phần của thư viện tiêu chuẩn trong Python 3.7. Tuy nhiên, trên các phiên bản cũ của Python, một backport có sẵn là 01. Để sử dụng backport, cài đặt nó từ PYPI: 9Backport tương thích với Python 2.7 cũng như các phiên bản Python 3,4 trở lên. Có một yêu cầu khi sử dụng 97: Các tệp tài nguyên của bạn phải có sẵn trong một gói thông thường. Gói không gian tên aren được hỗ trợ. Trong thực tế, điều này có nghĩa là tệp phải nằm trong một thư mục chứa tệp 56.Ví dụ đầu tiên, giả sử bạn có tài nguyên bên trong một gói như thế này: 0 56 chỉ là một tệp trống cần thiết để chỉ định 05 dưới dạng gói thông thường.Sau đó, bạn có thể sử dụng 06 và 07 để mở các tệp văn bản và nhị phân, tương ứng:>>> 1 06 và 07 tương đương với 10 tích hợp với tham số 11 được đặt thành 12 và 13, tương ứng. Các chức năng thuận tiện để đọc trực tiếp các tệp văn bản hoặc nhị phân cũng có sẵn dưới dạng 14 và 15. Xem tài liệu chính thức để biết thêm thông tin.Phần còn lại của phần này sẽ hiển thị một vài ví dụ phức tạp về việc sử dụng các tệp tài nguyên trong thực tế. Ví dụ: Sử dụng tệp dữ liệuNhư một ví dụ đầy đủ hơn về việc sử dụng các tệp dữ liệu, bạn sẽ thấy cách triển khai chương trình đố dựa trên dữ liệu dân số của Liên Hợp Quốc. Đầu tiên, hãy tạo gói 16 và tải xuống 17 từ trang web của Liên Hợp Quốc: 2Mở tệp CSV và xem dữ liệu: 3Mỗi dòng chứa dân số của một quốc gia trong một năm nhất định và một biến thể nhất định, cho thấy loại kịch bản nào được sử dụng cho phép chiếu. Tệp chứa các dự báo dân số cho đến năm 2100. Chức năng sau đây đọc tệp này và chọn tổng dân số của mỗi quốc gia cho một 18 và 19: 4Các dòng được tô sáng cho thấy cách 97 được sử dụng để mở tệp dữ liệu. Để biết thêm thông tin về việc làm việc với các tệp CSV, hãy xem đọc và viết các tệp CSV bằng Python.Hàm trên trả về một từ điển với số dân số: >>> 5 06 và 07 tương đương với 10 tích hợp với tham số 11 được đặt thành 12 và 13, tương ứng. Các chức năng thuận tiện để đọc trực tiếp các tệp văn bản hoặc nhị phân cũng có sẵn dưới dạng 14 và 15. Xem tài liệu chính thức để biết thêm thông tin. 6Phần còn lại của phần này sẽ hiển thị một vài ví dụ phức tạp về việc sử dụng các tệp tài nguyên trong thực tế. Ví dụ: Sử dụng tệp dữ liệu 7Như một ví dụ đầy đủ hơn về việc sử dụng các tệp dữ liệu, bạn sẽ thấy cách triển khai chương trình đố dựa trên dữ liệu dân số của Liên Hợp Quốc. Đầu tiên, hãy tạo gói 16 và tải xuống 17 từ trang web của Liên Hợp Quốc:line 24, you also check that the 21 is less than 22. Locations with a 21 of 22 and above are not
proper countries, but aggregates like 25, 26, and so on.Mở tệp CSV và xem dữ liệu:Mỗi dòng chứa dân số của một quốc gia trong một năm nhất định và một biến thể nhất định, cho thấy loại kịch bản nào được sử dụng cho phép chiếu. Tệp chứa các dự báo dân số cho đến năm 2100. Chức năng sau đây đọc tệp này và chọn tổng dân số của mỗi quốc gia cho một 18 và 19:Các dòng được tô sáng cho thấy cách 97 được sử dụng để mở tệp dữ liệu. Để biết thêm thông tin về việc làm việc với các tệp CSV, hãy xem đọc và viết các tệp CSV bằng Python.Hãy nhớ rằng, khi phân phối gói của bạn, bạn thậm chí không đảm bảo rằng các tệp tài nguyên sẽ tồn tại dưới dạng các tệp vật lý trên hệ thống tệp. 97 giải quyết điều này bằng cách cung cấp 31. Hàm này sẽ trả về một đường dẫn vào tệp tài nguyên, tạo một tệp tạm thời nếu cần thiết.Để đảm bảo mọi tệp tạm thời được làm sạch đúng, bạn nên sử dụng 31 làm trình quản lý ngữ cảnh bằng cách sử dụng từ khóa 33:>>> 8Ví dụ đầy đủ, giả sử bạn có hệ thống phân cấp tệp sau: 9Nếu bạn muốn tự mình thử ví dụ, thì bạn có thể tải xuống các tệp này cùng với phần còn lại của mã nguồn được sử dụng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới: Mã được lưu trữ trong một tệp có tên đặc biệt 34. Tên này chỉ ra rằng tệp là điểm nhập cho gói. Có tệp 34 cho phép gói của bạn được thực thi bằng 36:Để biết thêm thông tin về việc gọi gói với 37, hãy xem cách xuất bản gói Python nguồn mở thành PYPI.GUI được định nghĩa trong một lớp gọi là 38. Lưu ý rằng bạn sử dụng 97 để có được đường dẫn của các tệp hình ảnh: 0Nếu bạn muốn tìm hiểu thêm về việc xây dựng GUI với Tkinter, thì hãy xem chương trình GUI Python với Tkinter. Tài liệu chính thức cũng có một danh sách các tài nguyên tốt đẹp để bắt đầu và hướng dẫn tại TKDOCS là một tài nguyên tuyệt vời khác cho thấy cách sử dụng TK trong các ngôn ngữ khác. Để đảm bảo rằng các hình ảnh được giữ xung quanh, bạn nên thêm một tham chiếu đến chúng. Bạn có thể thấy các ví dụ về điều này trong mã trên trên dòng 18 và 31.lines 18 and 31. Nhập khẩu độngMột trong những tính năng xác định của Python là nó là một ngôn ngữ rất năng động. Mặc dù đôi khi nó là một ý tưởng tồi, bạn có thể làm nhiều việc cho chương trình Python khi nó chạy, bao gồm thêm các thuộc tính vào một lớp, xác định lại các phương thức hoặc thay đổi tài liệu của một mô -đun. Chẳng hạn, bạn có thể thay đổi 40 để nó không làm gì cả:>>> 1Ví dụ đầy đủ, giả sử bạn có hệ thống phân cấp tệp sau: Nếu bạn muốn tự mình thử ví dụ, thì bạn có thể tải xuống các tệp này cùng với phần còn lại của mã nguồn được sử dụng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới:dynamic imports in Python. With them, you won’t have to decide what to import until your program is running. Mã được lưu trữ trong một tệp có tên đặc biệt >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 34. Tên này chỉ ra rằng tệp là điểm nhập cho gói. Có tệp >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 34 cho phép gói của bạn được thực thi bằng >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 36:Để biết thêm thông tin về việc gọi gói với 37, hãy xem cách xuất bản gói Python nguồn mở thành PYPI. 2GUI được định nghĩa trong một lớp gọi là 38. Lưu ý rằng bạn sử dụng 97 để có được đường dẫn của các tệp hình ảnh: 3Nếu bạn muốn tìm hiểu thêm về việc xây dựng GUI với Tkinter, thì hãy xem chương trình GUI Python với Tkinter. Tài liệu chính thức cũng có một danh sách các tài nguyên tốt đẹp để bắt đầu và hướng dẫn tại TKDOCS là một tài nguyên tuyệt vời khác cho thấy cách sử dụng TK trong các ngôn ngữ khác. Để đảm bảo rằng các hình ảnh được giữ xung quanh, bạn nên thêm một tham chiếu đến chúng. Bạn có thể thấy các ví dụ về điều này trong mã trên trên dòng 18 và 31.Nhập khẩu động Một trong những tính năng xác định của Python là nó là một ngôn ngữ rất năng động. Mặc dù đôi khi nó là một ý tưởng tồi, bạn có thể làm nhiều việc cho chương trình Python khi nó chạy, bao gồm thêm các thuộc tính vào một lớp, xác định lại các phương thức hoặc thay đổi tài liệu của một mô -đun. Chẳng hạn, bạn có thể thay đổi 40 để nó không làm gì cả: 4Về mặt kỹ thuật, bạn không xác định lại 40. Thay vào đó, bạn đã xác định một 40 khác trong việc tích hợp. Để quay trở lại bằng cách sử dụng 40 gốc, bạn có thể xóa tùy chỉnh của mình bằng 44. Nếu bạn rất nghiêng, bạn có thể theo dõi bất kỳ đối tượng Python nào được tích hợp vào phiên dịch.Trong phần này, bạn sẽ học cách thực hiện nhập khẩu động trong Python. Với họ, bạn đã thắng phải quyết định những gì sẽ nhập cho đến khi chương trình của bạn đang chạy. Sử dụng 45>>> 5Cho đến nay, bạn đã sử dụng từ khóa Python từ 34 để nhập các mô -đun và gói một cách rõ ràng. Tuy nhiên, toàn bộ máy móc nhập khẩu có sẵn trong gói 45 và điều này cho phép bạn thực hiện nhập khẩu của mình một cách năng động hơn. Tập lệnh sau yêu cầu người dùng cho tên của một mô -đun, nhập mô -đun đó và in tài liệu của nó: 48 Trả về một đối tượng mô -đun mà bạn có thể liên kết với bất kỳ biến nào. Sau đó, bạn có thể coi biến đó như một mô -đun được nhập thường xuyên. Bạn có thể sử dụng tập lệnh như thế này:Trong mỗi trường hợp, mô -đun được nhập động bởi >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 48.Ví dụ: Phương pháp nhà máy với các gói không gian tên Một ứng dụng sử dụng plugin một cách hiệu quả là công cụ trực quan khám phá keo. Keo có thể đọc nhiều định dạng dữ liệu khác nhau ra khỏi hộp. Tuy nhiên, nếu định dạng dữ liệu của bạn được hỗ trợ, thì bạn có thể viết trình tải dữ liệu tùy chỉnh của riêng mình. Bạn làm điều này bằng cách thêm một chức năng mà bạn trang trí và đặt ở một vị trí đặc biệt để dễ dàng tìm thấy keo. Bạn không cần phải thay đổi bất kỳ phần nào của mã nguồn keo. Xem tài liệu cho tất cả các chi tiết. Bạn có thể thiết lập một kiến trúc plugin tương tự mà bạn có thể sử dụng trong các dự án của riêng mình. Trong kiến trúc, có hai cấp độ:
Mô -đun 57 hiển thị kiến trúc plugin có các chức năng sau: 6Các chức năng của nhà máy được sử dụng để thêm chức năng cho các gói plugin. Bạn có thể thấy một số ví dụ về cách họ sử dụng trong thời gian ngắn. Nhìn vào tất cả các chi tiết của mã này nằm ngoài phạm vi của hướng dẫn này. Nếu bạn quan tâm, thì bạn có thể thấy một triển khai bằng cách mở rộng phần bên dưới. Mã sau đây cho thấy việc thực hiện 58 được mô tả ở trên: 7Việc thực hiện này là một chút đơn giản. Cụ thể, nó không thực hiện bất kỳ xử lý lỗi rõ ràng. Kiểm tra dự án PyPlugs để thực hiện đầy đủ hơn. Bạn có thể thấy rằng 59 sử dụng 60 để tải các plugin tự động. Ngoài ra, 61 sử dụng 62 để liệt kê tất cả các plugin có sẵn trong một gói nhất định.Hãy cùng xem xét một số ví dụ về cách sử dụng plugin. Ví dụ đầu tiên là gói 63 mà bạn có thể sử dụng để thêm nhiều lời chào khác nhau vào ứng dụng của mình. Một kiến trúc plugin đầy đủ chắc chắn là quá mức cần thiết cho ví dụ này, nhưng nó cho thấy cách các plugin hoạt động.Giả sử bạn có gói 63 sau: 8Mỗi mô -đun 63 xác định một hàm có một đối số 42. Lưu ý cách họ đã đăng ký làm plugin bằng cách sử dụng trình trang trí 67: 9Để tìm hiểu thêm về các nhà trang trí và cách họ sử dụng, hãy xem Primer trên các nhà trang trí Python. Để hoàn thành việc thiết lập 63 dưới dạng gói plugin, bạn có thể sử dụng các chức năng của nhà máy trong 57 để thêm chức năng vào chính gói 63: 0Bây giờ bạn có thể sử dụng 71 và 72 như sau:>>> 1Lưu ý rằng 71 tự động phát hiện ra tất cả các plugin có sẵn trong gói.Bạn cũng có thể tự động chọn plugin nào để gọi. Trong ví dụ sau, bạn chọn một plugin một cách ngẫu nhiên. Tuy nhiên, bạn cũng có thể chọn một plugin dựa trên tệp cấu hình hoặc đầu vào người dùng: >>> 2Lưu ý rằng 71 tự động phát hiện ra tất cả các plugin có sẵn trong gói. 3Bạn cũng có thể tự động chọn plugin nào để gọi. Trong ví dụ sau, bạn chọn một plugin một cách ngẫu nhiên. Tuy nhiên, bạn cũng có thể chọn một plugin dựa trên tệp cấu hình hoặc đầu vào người dùng:
67 Các trình trang trí được xác định bên trong mỗi mô -đun plugin Đăng ký mỗi plugin được nhập.
Mỗi tệp Python không bắt đầu với một dấu gạch dưới được nhập. Plugin trong bất kỳ tệp nào được phát hiện và đăng ký. 4Hãy để kết thúc phần này với phiên bản cuối cùng của gói tên nối tiếp. Một vấn đề nổi bật là nhà máy 53 đã đưa ra các giả định mạnh mẽ về việc đặt tên của các lớp serializer. Bạn có thể làm cho điều này linh hoạt hơn bằng các plugin. 5Đầu tiên, thêm một dòng đăng ký từng bộ tuần tự. Dưới đây là một ví dụ về cách mà nó đã thực hiện trong 77 serializer:Tiếp theo, cập nhật 84 để sử dụng 57:Bạn triển khai >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 53 bằng cách sử dụng >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 87 vì điều đó sẽ tự động khởi động từng bộ tuần tự. Với việc tái cấu trúc này, các serializer hoạt động giống như trước đó. Tuy nhiên, bạn có sự linh hoạt hơn trong việc đặt tên các lớp serializer của bạn.Để biết thêm thông tin về việc sử dụng các plugin, hãy xem pyplugs trên PYPI và các plugin: thêm tính linh hoạt vào bản trình bày ứng dụng của bạn từ Pycon 2019. Như với hầu hết các phần của Python, hệ thống nhập có thể được tùy chỉnh. Bạn sẽ thấy một số cách mà bạn có thể thay đổi hệ thống nhập, bao gồm tự động tải xuống các gói bị thiếu từ PYPI và nhập tệp dữ liệu như thể chúng là mô -đun. Nhập khẩu nội bộCác chi tiết của hệ thống nhập khẩu Python được mô tả trong tài liệu chính thức. Ở cấp độ cao, ba điều xảy ra khi bạn nhập mô -đun (hoặc gói). Mô -đun là:
Đối với các nhập khẩu thông thường, những người được thực hiện với tuyên bố 34, tất cả ba bước sẽ tự động xảy ra. Tuy nhiên, khi bạn sử dụng 45, chỉ có hai bước đầu tiên là tự động. Bạn cần tự liên kết mô -đun với một biến hoặc không gian tên.Chẳng hạn, các phương pháp nhập khẩu và đổi tên sau 43 gần như tương đương:>>> 6Tất nhiên, trong mã thông thường, bạn nên thích cái trước. Một điều cần lưu ý là, ngay cả khi bạn chỉ nhập một thuộc tính từ một mô -đun, toàn bộ mô -đun được tải và thực thi. Phần còn lại của nội dung của mô -đun chỉ cần liên kết với không gian tên hiện tại. Một cách để chứng minh điều này là có một cái nhìn về những gì được gọi là bộ đệm mô -đun:module cache: >>> 7Tất nhiên, trong mã thông thường, bạn nên thích cái trước. Một điều cần lưu ý là, ngay cả khi bạn chỉ nhập một thuộc tính từ một mô -đun, toàn bộ mô -đun được tải và thực thi. Phần còn lại của nội dung của mô -đun chỉ cần liên kết với không gian tên hiện tại. Một cách để chứng minh điều này là có một cái nhìn về những gì được gọi là bộ đệm mô -đun: 91 hoạt động như một bộ đệm mô -đun. Nó chứa các tài liệu tham khảo cho tất cả các mô -đun đã được nhập.Bộ đệm mô -đun đóng vai trò rất quan trọng trong hệ thống nhập Python. Vị trí đầu tiên Python tìm kiếm các mô -đun khi thực hiện nhập khẩu là trong ____391. Nếu một mô -đun đã có sẵn, thì nó sẽ được tải lại. Đây là một tối ưu hóa tuyệt vời, nhưng nó cũng là một điều cần thiết. Nếu các mô -đun được tải lại mỗi khi chúng được nhập, thì bạn có thể kết thúc với sự không nhất quán trong các tình huống nhất định, chẳng hạn như khi mã nguồn cơ bản thay đổi trong khi tập lệnh đang chạy.Nhớ lại con đường nhập khẩu bạn đã thấy trước đó. Về cơ bản, nó cho Python ở đâu để tìm kiếm các mô -đun. Tuy nhiên, nếu Python tìm thấy một mô -đun trong bộ đệm mô -đun, thì nó đã giành được phiền khi tìm kiếm đường dẫn nhập cho mô -đun.singleton is a class with at most one instance. While it’s possible to implement singletons in Python, most good uses of singletons can be handled by modules instead. You can trust the module cache to instantiate a class only once. Ví dụ: singletons là mô -đun 8Trong lập trình hướng đối tượng, một singleton là một lớp có tối đa một trường hợp. Mặc dù có thể thực hiện các singletons trong Python, nhưng hầu hết các cách sử dụng tốt của singletons có thể được xử lý bằng các mô -đun thay thế. Bạn có thể tin tưởng bộ nhớ cache mô -đun để khởi tạo một lớp chỉ một lần. Ví dụ, hãy để Lừa trở lại dữ liệu dân số của Liên Hợp Quốc mà bạn đã thấy trước đó. Mô -đun sau đây xác định một lớp gói dữ liệu dân số: >>> 9Tất nhiên, trong mã thông thường, bạn nên thích cái trước. Một điều cần lưu ý là, ngay cả khi bạn chỉ nhập một thuộc tính từ một mô -đun, toàn bộ mô -đun được tải và thực thi. Phần còn lại của nội dung của mô -đun chỉ cần liên kết với không gian tên hiện tại. Một cách để chứng minh điều này là có một cái nhìn về những gì được gọi là bộ đệm mô -đun: 91 hoạt động như một bộ đệm mô -đun. Nó chứa các tài liệu tham khảo cho tất cả các mô -đun đã được nhập. 0Bộ đệm mô -đun đóng vai trò rất quan trọng trong hệ thống nhập Python. Vị trí đầu tiên Python tìm kiếm các mô -đun khi thực hiện nhập khẩu là trong ____391. Nếu một mô -đun đã có sẵn, thì nó sẽ được tải lại. Đây là một tối ưu hóa tuyệt vời, nhưng nó cũng là một điều cần thiết. Nếu các mô -đun được tải lại mỗi khi chúng được nhập, thì bạn có thể kết thúc với sự không nhất quán trong các tình huống nhất định, chẳng hạn như khi mã nguồn cơ bản thay đổi trong khi tập lệnh đang chạy.Nhớ lại con đường nhập khẩu bạn đã thấy trước đó. Về cơ bản, nó cho Python ở đâu để tìm kiếm các mô -đun. Tuy nhiên, nếu Python tìm thấy một mô -đun trong bộ đệm mô -đun, thì nó đã giành được phiền khi tìm kiếm đường dẫn nhập cho mô -đun. Ví dụ: singletons là mô -đun >>> 1Tất nhiên, trong mã thông thường, bạn nên thích cái trước. Một điều cần lưu ý là, ngay cả khi bạn chỉ nhập một thuộc tính từ một mô -đun, toàn bộ mô -đun được tải và thực thi. Phần còn lại của nội dung của mô -đun chỉ cần liên kết với không gian tên hiện tại. Một cách để chứng minh điều này là có một cái nhìn về những gì được gọi là bộ đệm mô -đun: >>> 1Tất nhiên, trong mã thông thường, bạn nên thích cái trước. Một điều cần lưu ý là, ngay cả khi bạn chỉ nhập một thuộc tính từ một mô -đun, toàn bộ mô -đun được tải và thực thi. Phần còn lại của nội dung của mô -đun chỉ cần liên kết với không gian tên hiện tại. Một cách để chứng minh điều này là có một cái nhìn về những gì được gọi là bộ đệm mô -đun: >>> 3Tất nhiên, trong mã thông thường, bạn nên thích cái trước. >>> 4Lưu ý rằng 02 yêu cầu một đối tượng mô -đun, không phải là một chuỗi như 48. Ngoài ra, hãy lưu ý rằng 02 có một số cảnh báo. Cụ thể, các biến đề cập đến các đối tượng trong một mô-đun không được giới hạn lại với các đối tượng mới khi mô-đun đó được tải lại. Xem tài liệu để biết thêm chi tiết.Người tìm và bộ tảiBạn đã thấy trước đó rằng việc tạo các mô -đun có cùng tên với các thư viện tiêu chuẩn có thể tạo ra sự cố. Ví dụ: nếu bạn có một tệp có tên 05 trong đường dẫn nhập của Python, thì bạn đã giành chiến thắng có thể nhập 39 từ thư viện tiêu chuẩn.Mặc dù vậy, đây là trường hợp luôn luôn như vậy. Tạo một tệp có tên 07 với nội dung sau: 5Tiếp theo, mở một thông dịch viên Python và nhập mô -đun mới này: >>> 6Một cái gì đó kỳ lạ đã xảy ra. Nó không giống như Python nhập mô -đun 08 mới của bạn. Thay vào đó, nó đã nhập mô -đun 08 từ thư viện tiêu chuẩn. Tại sao các mô -đun thư viện tiêu chuẩn lại hoạt động không nhất quán? Bạn có thể nhận được một gợi ý bằng cách kiểm tra các mô -đun:>>> 7Bạn có thể thấy rằng 39 được nhập từ một tệp, trong khi 08 là một loại mô-đun tích hợp. Có vẻ như các mô-đun tích hợp không được che mờ bởi các mô-đun địa phương.Hãy để đào sâu hơn nữa vào hệ thống nhập khẩu Python. Điều này cũng sẽ cho thấy lý do tại sao các mô-đun tích hợp không bị che khuất bởi các mô-đun địa phương. Có một số bước liên quan khi nhập mô -đun:
Bạn có thể mở rộng hệ thống nhập Python bằng cách triển khai trình tìm kiếm của riêng bạn và, nếu cần, trình tải của riêng bạn. Bạn sẽ thấy một ví dụ hữu ích hơn về một công cụ tìm kiếm sau này. Hiện tại, bạn sẽ học cách thực hiện các tùy chỉnh cơ bản (và có thể ngớ ngẩn) của hệ thống nhập khẩu. 13 Điều khiển mà người tìm được gọi trong quá trình nhập:>>> 8Đầu tiên, lưu ý rằng điều này trả lời câu hỏi từ trước đó: các mô-đun tích hợp không bị che khuất bởi các mô-đun cục bộ vì công cụ tìm tích hợp được gọi trước công cụ tìm đường dẫn nhập, tìm thấy các mô-đun cục bộ. Thứ hai, lưu ý rằng bạn có thể tùy chỉnh 13 theo ý thích của bạn.Để nhanh chóng gây rối phiên Python của bạn, bạn có thể xóa tất cả các công cụ tìm kiếm: >>> 9Vì không có người tìm thấy, Python có thể tìm thấy hoặc nhập các mô -đun mới. Tuy nhiên, Python vẫn có thể nhập các mô -đun đã có trong bộ đệm mô -đun vì nó nhìn ở đó trước khi gọi bất kỳ công cụ tìm kiếm nào. Trong ví dụ trên, 45 đã được tải dưới mui xe trước khi bạn xóa danh sách các công cụ tìm. Nếu bạn thực sự muốn làm cho phiên Python của bạn hoàn toàn không thể sử dụng được, thì bạn cũng có thể xóa bộ đệm mô -đun, 91.Sau đây là một ví dụ hữu ích hơn một chút. Bạn có thể viết một công cụ tìm kiếm một thông báo vào bảng điều khiển xác định mô -đun đang được nhập. Ví dụ cho thấy cách thêm công cụ tìm kiếm của riêng bạn, mặc dù nó không thực sự cố gắng tìm một mô -đun: 0Tất cả các công cụ tìm phải thực hiện một phương thức lớp 17, nên cố gắng tìm một mô -đun nhất định. Có ba cách mà 17 có thể chấm dứt:
21 in một thông báo vào bảng điều khiển và sau đó trả về rõ ràng 19 để chỉ ra rằng các công cụ tìm kiếm khác nên tìm ra cách thực sự nhập mô -đun.Bằng cách chèn 21 Đầu tiên trong danh sách các công cụ tìm, bạn sẽ nhận được một danh sách chạy của tất cả các mô -đun đang được nhập:>>> 1Ví dụ, bạn có thể thấy rằng việc nhập 24 kích hoạt việc nhập một số mô -đun khác mà 24 phụ thuộc vào. Lưu ý rằng tùy chọn dài dòng cho trình thông dịch Python, 26, cung cấp thông tin tương tự và nhiều, nhiều hơn nữa.Ví dụ khác, hãy nói rằng bạn đang thực hiện một nhiệm vụ để loại bỏ thế giới của các biểu hiện thông thường. . 2Tăng 20 đảm bảo rằng không có công cụ tìm kiếm sau này trong danh sách người tìm sẽ được thực thi. Điều này có hiệu quả ngăn bạn sử dụng các biểu thức thông thường trong Python:>>> 3Mặc dù bạn chỉ nhập 24, mô -đun đó đang nhập 27 phía sau hậu trường, do đó, một lỗi được nêu ra.Ví dụ: Tự động cài đặt từ PYPIBởi vì hệ thống nhập Python đã khá mạnh mẽ và hữu ích, có nhiều cách để làm hỏng nó hơn là mở rộng nó theo một cách hữu ích. Tuy nhiên, ví dụ sau đây có thể hữu ích trong các tình huống nhất định. Chỉ số gói Python (PYPI) là cửa hàng phô mai một cửa của bạn để tìm các mô-đun và gói của bên thứ ba. Nó cũng là nơi mà 38 tải xuống các gói.Trong các hướng dẫn Python thực sự khác, bạn có thể đã thấy các hướng dẫn sử dụng 32 để cài đặt các mô-đun và gói của bên thứ ba bạn cần theo dõi cùng với các ví dụ. Sẽ thật tuyệt khi có Python tự động cài đặt các mô -đun bị thiếu cho bạn?Công cụ tìm kiếm sau đây cố gắng cài đặt các mô -đun bằng cách sử dụng 38: 4So với những người tìm thấy bạn đã thấy trước đó, cái này phức tạp hơn một chút. Bằng cách đặt công cụ tìm kiếm này cuối cùng trong danh sách các công cụ tìm kiếm, bạn sẽ biết rằng nếu bạn gọi 34, thì mô -đun won won sẽ được tìm thấy trên hệ thống của bạn. Do đó, công việc của 17 chỉ là làm 36. Nếu cài đặt hoạt động, thì thông số mô -đun sẽ được tạo và trả về.Cố gắng sử dụng thư viện 37 mà không cần tự cài đặt:>>> 5Thông thường, 38 sẽ tăng lên 20, nhưng trong trường hợp này 37 đã được cài đặt và nhập.Trong khi 34 dường như hoạt động, có một số thách thức với phương pháp này. Một vấn đề lớn là tên nhập của một mô -đun không phải lúc nào cũng tương ứng với tên của nó trên PYPI. Ví dụ: đầu đọc nguồn cấp dữ liệu Python thực sự được gọi là 42 trên PYPI, nhưng tên nhập đơn giản là 43.Sử dụng 34 để nhập và cài đặt 43 kết thúc việc cài đặt sai gói:>>> 6Điều này có thể có hậu quả tai hại cho dự án của bạn. Một tình huống trong đó các cài đặt tự động có thể khá hữu ích là khi bạn đang chạy Python trong đám mây với sự kiểm soát hạn chế hơn đối với môi trường của bạn, chẳng hạn như khi bạn chạy sổ ghi chép kiểu Jupyter tại Google Colaboratory. Môi trường Notebook Colab là tuyệt vời để thực hiện thăm dò dữ liệu hợp tác. Một sổ ghi chép điển hình đi kèm với nhiều gói khoa học dữ liệu được cài đặt, bao gồm Numpy, Pandas và Matplotlib và bạn có thể thêm các gói mới với 38. Nhưng bạn cũng có thể kích hoạt cài đặt tự động:Vì 47 không có sẵn cục bộ trên máy chủ colab, mã được sao chép vào ô đầu tiên của máy tính xách tay.
Ví dụ: Nhập tệp dữ liệuVí dụ cuối cùng trong phần này được lấy cảm hứng từ bài đăng trên blog tuyệt vời của Aleksey Bilogur, nhập khẩu hầu hết mọi thứ trong Python: một phần giới thiệu cho các trình tải và tìm mô -đun. Bạn đã thấy cách sử dụng 97 để nhập DataFiles. Tại đây, thay vào đó, bạn sẽ thực hiện một trình tải tùy chỉnh có thể nhập trực tiếp tệp CSV.Trước đó, bạn đã làm việc với một tệp CSV khổng lồ với dữ liệu dân số. Để làm cho ví dụ Trình tải tùy chỉnh dễ quản lý hơn, hãy xem xét tệp 49 nhỏ hơn sau: 7Dòng đầu tiên là một tiêu đề đặt tên ba trường và hai hàng dữ liệu sau đây có chứa thông tin về một nhân viên. Để biết thêm thông tin về việc làm việc với các tệp CSV, hãy xem đọc và viết các tệp CSV bằng Python. Mục tiêu của bạn trong phần này là viết trình tìm và trình tải cho phép bạn nhập trực tiếp tệp CSV để bạn có thể viết mã như sau: >>> 8Công việc của người tìm sẽ là tìm kiếm và nhận ra các tệp CSV. Công việc của Trình tải sẽ là nhập dữ liệu CSV. Thông thường, bạn có thể triển khai người tìm và trình tải tương ứng trong một lớp chung. Đó là cách tiếp cận mà bạn sẽ thực hiện ở đây: 9Có khá nhiều mã trong ví dụ này! May mắn thay, hầu hết các công việc được thực hiện trong 17 và 51. Hãy cùng nhìn vào họ chi tiết hơn.Như bạn đã thấy trước đó, 17 chịu trách nhiệm tìm mô -đun. Trong trường hợp này, bạn đang tìm kiếm các tệp CSV, vì vậy bạn tạo tên tệp có hậu tố 53. 42 chứa tên đầy đủ của mô -đun được nhập. Ví dụ: nếu bạn sử dụng 55, thì 42 sẽ là 57. Trong trường hợp này, tên tệp sẽ là 49.Đối với nhập khẩu cấp cao nhất, 59 sẽ là 19. Trong trường hợp đó, bạn tìm kiếm tệp CSV trong đường dẫn nhập đầy đủ, sẽ bao gồm thư mục làm việc hiện tại. Nếu bạn đang nhập tệp CSV trong gói, thì 59 sẽ được đặt thành đường dẫn hoặc đường dẫn của gói. Nếu bạn tìm thấy một tệp CSV phù hợp, thì một thông số mô -đun sẽ được trả về. Thông số mô -đun này cho Python tải mô -đun bằng 62.Dữ liệu CSV được tải bởi 51. Bạn có thể sử dụng 64 từ thư viện tiêu chuẩn để thực hiện phân tích cú pháp thực tế của tệp. Giống như hầu hết mọi thứ trong Python, các mô -đun được hỗ trợ bởi từ điển. Bằng cách thêm dữ liệu CSV vào 65, bạn cung cấp nó dưới dạng thuộc tính của mô -đun.Chẳng hạn, việc thêm 66 vào từ điển mô -đun trên dòng 44 cho phép bạn liệt kê các tên trường trong tệp CSV như sau:line 44 allows you to list the field names in the CSV file as follows:>>> 0Nói chung, tên trường CSV có thể chứa các không gian và các ký tự khác được cho phép trong tên thuộc tính Python. Trước khi thêm các trường làm thuộc tính trên mô -đun, bạn sẽ vệ sinh tên trường bằng cách sử dụng biểu thức chính quy. Điều này được thực hiện trong 67 bắt đầu trên dòng 51.line 51.Bạn có thể thấy một ví dụ về hiệu ứng này trong tên trường 68 ở trên. Nếu bạn nhìn vào tệp CSV ban đầu, thì bạn sẽ thấy rằng tiêu đề nói 69 với không gian thay vì dấu gạch dưới.Bằng cách kết nối 62 này vào hệ thống nhập Python, bạn sẽ nhận được một chút chức năng công bằng miễn phí. Ví dụ: bộ đệm mô -đun sẽ đảm bảo rằng tệp dữ liệu chỉ được tải một lần.Nhập mẹo và thủ thuật nhập khẩuĐể làm tròn hướng dẫn này, bạn sẽ thấy một vài lời khuyên về cách xử lý các tình huống nhất định xuất hiện theo thời gian. Bạn sẽ thấy cách xử lý các gói bị thiếu, nhập chu kỳ và thậm chí các gói được lưu trữ bên trong các tệp zip. Xử lý các gói trên các phiên bản PythonĐôi khi bạn cần xử lý các gói có tên khác nhau tùy thuộc vào phiên bản Python. Bạn đã thấy một ví dụ về điều này: 97 chỉ có sẵn kể từ Python 3.7. Trong các phiên bản trước của Python, bạn cần cài đặt và sử dụng 01 thay thế.Miễn là các phiên bản khác nhau của gói tương thích, bạn có thể xử lý việc này bằng cách đổi tên gói bằng 73: 1Trong phần còn lại của mã, bạn có thể tham khảo 74 và không lo lắng về việc bạn sử dụng 97 hay 01.Thông thường, nó dễ dàng nhất để sử dụng câu lệnh 36 để tìm ra phiên bản nào sẽ sử dụng. Một tùy chọn khác là kiểm tra phiên bản của trình thông dịch Python. Tuy nhiên, điều này có thể thêm một số chi phí bảo trì nếu bạn cần cập nhật số phiên bản.Bạn có thể viết lại ví dụ trước như sau: 2Điều này sẽ sử dụng 97 trên Python 3.7 trở lên trong khi rơi trở lại 01 trên các phiên bản Python cũ hơn. Xem dự án 80 để biết lời khuyên tốt và trong tương lai về cách kiểm tra phiên bản Python nào đang chạy.Xử lý các gói bị thiếu: Sử dụng một giải pháp thay thếTrường hợp sử dụng sau đây có liên quan chặt chẽ với ví dụ trước. Giả sử có một sự tái tạo tương thích của một gói. Việc tái tạo được tối ưu hóa tốt hơn, vì vậy bạn muốn sử dụng nó nếu nó có sẵn. Tuy nhiên, gói gốc dễ dàng hơn và cũng cung cấp hiệu suất chấp nhận được. Một ví dụ như vậy là 81, đây là phiên bản tối ưu của 82 từ thư viện tiêu chuẩn. Bạn có thể xử lý các tùy chọn này giống như cách bạn xử lý các tên gói khác nhau trước đó: 3Điều này sẽ sử dụng 81 nếu nó có sẵn và quay trở lại 82 nếu không.Một ví dụ tương tự khác là Gói Ultrajson, bộ mã hóa và bộ giải mã JSON cực nhanh có thể được sử dụng để thay thế cho 76 trong thư viện tiêu chuẩn: 4Bằng cách đổi tên 86 thành 76, bạn không phải lo lắng về gói nào đã được nhập khẩu.Xử lý các gói bị thiếu: sử dụng một giả thay thếMột ví dụ thứ ba, liên quan là thêm một gói cung cấp một tính năng đẹp mắt mà không hoàn toàn cần thiết cho ứng dụng của bạn. Một lần nữa, điều này có thể được giải quyết bằng cách thêm 36 vào nhập khẩu của bạn. Thách thức thêm là cách bạn sẽ thay thế gói tùy chọn nếu nó không có sẵn.Đối với một ví dụ cụ thể, giả sử rằng bạn sử dụng Colorama để thêm văn bản màu vào bảng điều khiển. Colorama chủ yếu bao gồm các hằng số chuỗi đặc biệt thêm màu khi được in: >>> 5Thật không may, màu sắc không kết xuất trong ví dụ trên. Trong thiết bị đầu cuối của bạn, nó sẽ trông giống như thế này: Trước khi bạn bắt đầu sử dụng Colorama Colors, bạn nên gọi 89. Cài đặt 90 thành 91 có nghĩa là các chỉ thị màu sẽ được tự động đặt lại ở cuối chuỗi. Nó có một cài đặt hữu ích nếu bạn muốn tô màu chỉ một dòng tại một thời điểm.Nếu bạn thay vì có tất cả đầu ra của bạn (ví dụ) màu xanh, thì bạn có thể để 90 là 93 và thêm 94 vào đầu tập lệnh của bạn. Các màu sau có sẵn:>>> 6Bạn cũng có thể sử dụng 95 để kiểm soát kiểu văn bản của bạn. Bạn có thể chọn giữa 96, 97 và 98.Cuối cùng, 99 cung cấp các mã để kiểm soát vị trí của con trỏ. Bạn có thể sử dụng nó để hiển thị tiến trình hoặc trạng thái của tập lệnh đang chạy. Ví dụ sau hiển thị đếm ngược từ 00: 7Lưu ý cách bộ đếm giữ nguyên vị trí thay vì in trên các dòng riêng biệt như bình thường: Hãy để Lùi trở lại với nhiệm vụ trong tay. Đối với nhiều ứng dụng, việc thêm màu vào đầu ra bảng điều khiển của bạn là mát mẻ nhưng không quan trọng. Để tránh thêm một sự phụ thuộc khác vào ứng dụng của bạn, bạn chỉ muốn sử dụng Colorama nếu nó có sẵn trên hệ thống và không phá vỡ ứng dụng nếu đó là không. Để làm điều này, bạn có thể lấy cảm hứng từ thử nghiệm và việc sử dụng giả. Một giả có thể thay thế cho một đối tượng khác trong khi cho phép bạn kiểm soát hành vi của nó. Ở đây, một nỗ lực ngây thơ trong việc chế giễu Colorama: >>> 8Điều này không hoạt động khá, bởi vì 01 được thể hiện bằng một chuỗi làm rối tung đầu ra của bạn. Thay vào đó, bạn muốn tạo một đối tượng luôn hiển thị dưới dạng chuỗi trống.Nó có thể thay đổi giá trị trả về của 60 trên các đối tượng 03. Tuy nhiên, trong trường hợp này, nó rất thuận tiện để viết giả của riêng bạn: 9 04 là một chuỗi trống cũng sẽ trả về chuỗi trống khi nó được gọi. Điều này hiệu quả cho chúng ta một sự tái tạo của Colorama, chỉ không có màu sắc.Thủ thuật cuối cùng là 05 tự trả về, để tất cả các màu, kiểu dáng và chuyển động con trỏ là thuộc tính trên 06, 07, 08 và 09 cũng bị chế giễu.Mô-đun 10 được thiết kế để thay thế cho Colorama, do đó bạn có thể cập nhật ví dụ đếm ngược bằng tìm kiếm và thay thế: 00Nếu bạn chạy tập lệnh này trên một hệ thống mà Colorama không có sẵn, thì nó vẫn hoạt động, nhưng nó có thể không đẹp như vậy: Với Colorama được cài đặt, bạn sẽ thấy kết quả tương tự như trước đó. Nhập tập lệnh dưới dạng mô -đunMột sự khác biệt giữa các tập lệnh và mô -đun thư viện là các tập lệnh thường làm một cái gì đó, trong khi các thư viện cung cấp chức năng. Cả hai tập lệnh và thư viện đều sống bên trong các tệp Python thông thường và liên quan đến Python, không có sự khác biệt giữa chúng. Thay vào đó, sự khác biệt là cách sử dụng tệp được sử dụng: nó có nên được thực thi bằng 11 hoặc được nhập với 12 bên trong một tập lệnh khác?Đôi khi, bạn sẽ có một mô -đun hoạt động như một tập lệnh và thư viện. Bạn có thể cố gắng tái cấu trúc mô -đun của mình thành hai tệp khác nhau. Một ví dụ về điều này trong thư viện tiêu chuẩn là gói 76. Bạn thường sử dụng nó như một thư viện, nhưng nó cũng đi kèm với một tập lệnh có thể trang trí các tệp JSON. Giả sử bạn có tệp 14 sau: 01Vì JSON thường chỉ được đọc bằng máy, nhiều tệp JSON được định dạng theo kiểu có thể đọc được. Trên thực tế, nó khá phổ biến đối với các tệp JSON bao gồm một dòng văn bản rất dài. 15 là một tập lệnh sử dụng thư viện ____276 để định dạng JSON theo kiểu dễ đọc hơn: 02Bây giờ cấu trúc của tệp JSON trở nên ít phức tạp hơn để nắm bắt. Bạn có thể sử dụng tùy chọn 17 để sắp xếp các phím theo thứ tự bảng chữ cái.Mặc dù nó thực hành tốt để chia các tập lệnh và thư viện, Python có một thành ngữ giúp có thể coi một mô -đun như một tập lệnh và thư viện cùng một lúc. Như đã lưu ý trước đó, giá trị của biến mô -đun 08 đặc biệt được đặt ở thời gian chạy dựa trên việc mô -đun được nhập hay chạy dưới dạng tập lệnh.Hãy để thử nghiệm nó ra! Tạo tệp sau: 03Nếu bạn chạy tệp này, thì bạn sẽ thấy 08 được đặt thành giá trị đặc biệt 09: 04Tuy nhiên, nếu bạn nhập mô -đun, thì 08 sẽ được đặt thành tên của mô -đun:Hành vi này được tận dụng trong mô hình sau: 05Hãy để sử dụng điều này trong một ví dụ lớn hơn. Trong một nỗ lực để giữ cho bạn trẻ, tập lệnh sau đây sẽ thay thế bất kỳ tuổi cũ nào của người Hồi giáo ( 22 trở lên) bằng 99: 06Bạn có thể chạy nó như một kịch bản và nó sẽ tương tác làm cho độ tuổi bạn gõ trẻ hơn: 07Bạn cũng có thể sử dụng mô -đun như một thư viện có thể nhập. Thử nghiệm 07 trên dòng 12 đảm bảo rằng không có tác dụng phụ khi bạn nhập thư viện. Chỉ các hàm 25 và 26 được xác định. Ví dụ, bạn có thể sử dụng thư viện này như sau:line 12 makes sure that there are no side effects when you import the library. Only the
functions 25 and 26 are defined. You can, for instance, use this library as follows:>>> 08Điều này không hoạt động khá, bởi vì 01 được thể hiện bằng một chuỗi làm rối tung đầu ra của bạn. Thay vào đó, bạn muốn tạo một đối tượng luôn hiển thị dưới dạng chuỗi trống.Nó có thể thay đổi giá trị trả về của >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 60 trên các đối tượng # world/africa/__init__.py (Empty file) # world/africa/zimbabwe.py print("Shona: Mhoroyi vhanu vese") print("Ndebele: Sabona mhlaba") # world/europe/__init__.py from . import greece from . import norway # world/europe/greece.py print("Greek: Γειά σας Κόσμε") # world/europe/norway.py print("Norwegian: Hei verden") # world/europe/spain.py print("Castellano: Hola mundo") # world/__init__.py from . import africa 03. Tuy nhiên, trong trường hợp này, nó rất thuận tiện để viết giả của riêng bạn: 04 là một chuỗi trống cũng sẽ trả về chuỗi trống khi nó được gọi. Điều này hiệu quả cho chúng ta một sự tái tạo của Colorama, chỉ không có màu sắc.Tuy nhiên, lưu ý rằng điều này vẫn yêu cầu Python được cài đặt trên hệ thống. Nếu bạn muốn phân phối ứng dụng Python của mình dưới dạng tệp thực thi độc lập, thì hãy xem bằng PyInstaller để dễ dàng phân phối các ứng dụng Python. Nếu bạn cung cấp cho trình thông dịch Python một tệp zip, thì nó sẽ tìm một tệp có tên 34 bên trong kho lưu trữ zip, trích xuất nó và chạy nó. Ví dụ cơ bản, hãy tạo tệp 34 sau: 09Điều này sẽ in một tin nhắn khi bạn chạy nó: 10Bây giờ thêm nó vào một kho lưu trữ zip. Bạn có thể làm điều này trên dòng lệnh: 11Trên Windows, thay vào đó bạn có thể sử dụng điểm và nhấp. Chọn tệp trong tệp Explorer, sau đó nhấp chuột phải và chọn Gửi đến → Thư mục nén (Zipped). Vì 09 là một tên rất mô tả, bạn đã đặt tên cho tệp zip 33. Bây giờ bạn có thể gọi nó trực tiếp với Python: 12Lưu ý rằng kịch bản của bạn nhận thức được rằng nó sống bên trong 33. Hơn nữa, gốc của tệp zip của bạn được thêm vào đường dẫn nhập Python để các tập lệnh của bạn có thể nhập các mô -đun khác bên trong cùng một tệp zip.Hãy suy nghĩ lại ví dụ trước đó trong đó bạn đã tạo một bài kiểm tra dựa trên dữ liệu dân số. Nó có thể phân phối toàn bộ ứng dụng này dưới dạng một tệp zip duy nhất. 97 sẽ đảm bảo tệp dữ liệu được trích xuất từ kho lưu trữ zip khi nó cần.Ứng dụng bao gồm các tệp sau: 13Bạn có thể thêm chúng vào một tệp zip giống như cách bạn đã làm ở trên. Tuy nhiên, Python đi kèm với một công cụ gọi là 36 hợp lý hóa quá trình đóng gói các ứng dụng vào kho lưu trữ zip. Bạn sử dụng nó như sau: 14Lệnh này về cơ bản thực hiện hai điều: nó tạo ra một điểm nhập và gói ứng dụng của bạn. Hãy nhớ rằng bạn cần một tệp 34 như một điểm vào bên trong kho lưu trữ zip của bạn. Nếu bạn cung cấp tùy chọn 37 thông tin về cách bắt đầu ứng dụng của bạn, thì 36 sẽ tạo tệp này cho bạn. Trong ví dụ này, 34 được tạo trông như thế này: 15 34 này được đóng gói, cùng với nội dung của thư mục 42, vào một kho lưu trữ zip có tên 43. Hậu tố 44 báo hiệu cho thấy đây là một tệp Python được bọc vào kho lưu trữ zip.Trên Windows, các tệp 44 đã được đăng ký dưới dạng các tệp Python. Trên Mac và Linux, bạn có thể có 36 Tạo các tệp thực thi bằng cách sử dụng tùy chọn phiên dịch 47 và chỉ định trình thông dịch nào sẽ sử dụng: 16Tùy chọn 47 thêm một shebang ( 49) cho hệ điều hành cách chạy tệp. Ngoài ra, nó làm cho tệp 44 có thể thực thi để bạn có thể chạy tệp chỉ bằng cách nhập tên của nó:shebang ( 49) that tells the operating system how to run the file. Additionally, it makes the 44 file executable so that you can run the file just by typing its name: 17Lưu ý 51 trước tên tệp. Đây là một thủ thuật điển hình trên Mac và Linux để chạy các tệp thực thi trong thư mục hiện tại. Nếu bạn di chuyển tệp vào một thư mục trên 52 của bạn hoặc nếu bạn sử dụng Windows, thì bạn sẽ chỉ có thể sử dụng tên tệp: 43.Hãy cùng đóng phần này bằng cách xem xét một hiệu ứng tốt của việc sử dụng 97. Hãy nhớ rằng bạn đã sử dụng mã sau để mở tệp dữ liệu: 18Một cách phổ biến hơn để mở các tệp dữ liệu là xác định vị trí chúng dựa trên thuộc tính mô -đun của bạn ____ ____293: 19Cách tiếp cận này thường hoạt động tốt. Tuy nhiên, nó rơi ra khi ứng dụng của bạn được đóng gói vào tệp zip: 20Tệp dữ liệu của bạn nằm trong kho lưu trữ zip, vì vậy 10 không thể mở nó. 97, mặt khác, sẽ trích xuất dữ liệu của bạn vào một tệp tạm thời trước khi mở nó.Xử lý nhập khẩu theo chu kỳMột nhập khẩu theo chu kỳ xảy ra khi bạn có hai hoặc nhiều mô -đun nhập khẩu nhau. Một cách cụ thể hơn, hãy tưởng tượng rằng mô -đun 58 sử dụng 59 và mô -đun 60 nhập tương tự 58.Hệ thống nhập khẩu Python sườn ở một mức độ nào đó được thiết kế để xử lý các chu kỳ nhập khẩu. Chẳng hạn, mã sau đây, trong khi không hữu ích lắm. 21Cố gắng nhập 58 trong trình thông dịch tương tác nhập khẩu 60:>>> 22Lưu ý rằng 60 được nhập vào giữa việc nhập 58, chính xác là tại câu lệnh 59 trong mã nguồn của 58. Lý do điều này không kết thúc trong đệ quy vô tận là người bạn cũ của chúng tôi là bộ đệm mô -đun.Khi bạn nhập 68, một tham chiếu đến 58 được thêm vào bộ đệm mô -đun ngay cả trước khi 58 được tải. Khi 60 cố gắng nhập 58 sau, nó chỉ cần sử dụng tham chiếu trong bộ đệm mô -đun.Bạn cũng có thể có các mô -đun làm một cái gì đó hữu ích hơn một chút. Nếu bạn xác định các thuộc tính và hàm trong các mô -đun của mình, thì tất cả vẫn hoạt động: 23Nhập 58 hoạt động giống như trước đây:>>> 22Các vấn đề liên quan đến nhập khẩu đệ quy bắt đầu xuất hiện khi bạn thực sự sử dụng mô -đun khác tại thời điểm nhập thay vì chỉ xác định các chức năng sẽ sử dụng mô -đun khác sau này. Thêm một dòng vào 74: 25Bây giờ Python bị nhầm lẫn bởi việc nhập khẩu: >>> 26Các vấn đề liên quan đến nhập khẩu đệ quy bắt đầu xuất hiện khi bạn thực sự sử dụng mô -đun khác tại thời điểm nhập thay vì chỉ xác định các chức năng sẽ sử dụng mô -đun khác sau này. Thêm một dòng vào 74:Bây giờ Python bị nhầm lẫn bởi việc nhập khẩu: Thông báo lỗi có vẻ hơi khó hiểu lúc đầu. Nhìn lại mã nguồn, bạn có thể xác nhận rằng 00 được xác định trong mô -đun 58.>>> 27Các vấn đề liên quan đến nhập khẩu đệ quy bắt đầu xuất hiện khi bạn thực sự sử dụng mô -đun khác tại thời điểm nhập thay vì chỉ xác định các chức năng sẽ sử dụng mô -đun khác sau này. Thêm một dòng vào 74:>>> Các vấn đề liên quan đến nhập khẩu đệ quy bắt đầu xuất hiện khi bạn thực sự sử dụng mô -đun khác tại thời điểm nhập thay vì chỉ xác định các chức năng sẽ sử dụng mô -đun khác sau này. Thêm một dòng vào 74:Bây giờ Python bị nhầm lẫn bởi việc nhập khẩu: Thông báo lỗi có vẻ hơi khó hiểu lúc đầu. Nhìn lại mã nguồn, bạn có thể xác nhận rằng 00 được xác định trong mô -đun 58.try to break the cycles.Vấn đề là 00 được xác định trong 58 tại thời điểm 60 được nhập. Do đó, 80 được sử dụng bởi cuộc gọi đến 81.keep your modules free of side effects at import time.Để thêm vào sự nhầm lẫn, bạn sẽ không có vấn đề gì khi nhập 60:do your imports locally inside functions. Vào thời điểm 60 gọi 81, 58 được nhập hoàn toàn và 80 được xác định rõ. Như một bước ngoặt cuối cùng, vì bộ đệm mô -đun mà bạn đã thấy trước đó, 68 có thể hoạt động nếu bạn thực hiện một số nhập khẩu khác trước: 29 28>>> 30Vậy làm thế nào bạn có thể tránh bị sa lầy và bối rối bởi nhập khẩu theo chu kỳ? Có hai hoặc nhiều mô -đun nhập khẩu nhau thường là một dấu hiệu cho thấy bạn có thể cải thiện thiết kế các mô -đun của mình. Thông thường, thời điểm dễ dàng nhất để sửa chữa nhập khẩu theo chu kỳ là trước khi bạn thực hiện chúng. Nếu bạn thấy các chu kỳ trong các bản phác thảo kiến trúc của mình, hãy xem xét kỹ hơn và cố gắng phá vỡ các chu kỳ.Tuy nhiên, có những lúc nó hợp lý để giới thiệu một chu kỳ nhập khẩu. Như bạn đã thấy ở trên, đây không phải là vấn đề miễn là các mô -đun của bạn chỉ xác định các thuộc tính, chức năng, lớp học, v.v. Mẹo thứ hai, đó cũng là thực hành thiết kế tốt để giữ cho các mô -đun của bạn không có tác dụng phụ trong thời gian nhập khẩu. Nếu bạn thực sự cần các mô -đun có chu kỳ nhập khẩu và tác dụng phụ, thì vẫn còn một lối thoát khác: thực hiện nhập khẩu của bạn trong các chức năng bên trong. 31Lưu ý rằng trong mã sau, 59 được thực hiện bên trong 81. Điều này có hai hậu quả. Đầu tiên, 60 chỉ có sẵn bên trong hàm 81. Quan trọng hơn, việc nhập không xảy ra cho đến khi bạn gọi 81 sau khi 58 đã được nhập hoàn toàn:Bây giờ không có vấn đề nhập khẩu và sử dụng 58:Lưu ý rằng trên thực tế, 60 không được nhập cho đến khi bạn gọi 81. Đối với một góc nhìn khác về nhập khẩu theo chu kỳ, xem ghi chú cổ điển của Fredrik Lundh. 32Hồ sơ nhập khẩu Một mối quan tâm khi nhập một số mô -đun và gói là nó sẽ thêm vào thời gian khởi động của tập lệnh của bạn. Tùy thuộc vào ứng dụng của bạn, điều này có thể hoặc không quan trọng. 33Kể từ khi phát hành Python 3.7, bạn đã có một cách nhanh chóng để biết mất bao nhiêu thời gian để nhập các gói và mô -đun. Python 3.7 hỗ trợ tùy chọn dòng lệnh 97, đo lường và in bao nhiêu thời gian mỗi mô-đun để nhập:Cột 98 cho thấy thời gian tích lũy của nhập khẩu (tính bằng micro giây) trên cơ sở mỗi gói. Bạn có thể đọc danh sách như sau: Python đã chi 99 micro giây để nhập hoàn toàn 00, liên quan đến việc nhập 08, 39 và triển khai C 03.Cột >>> import world
>>> world
|