Nhập tất cả các chức năng từ tệp python
Trong Python, bạn sử dụng từ khóa 44 để tạo mã trong một mô-đun có sẵn trong một mô-đun khác. Nhập 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 đú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 vẫn duy trì dự án của mình Show
Hướng dẫn này sẽ cung cấp một cái nhìn tổng quan về câu lệnh 44 của Python và cách thức hoạt động của nó. Hệ thống nhập rất mạnh và bạn sẽ học cách khai thác sức mạnh này. Mặc dù bạn sẽ đề cập đến nhiều khái niệm đằng sau hệ thống nhập của Python, hướng dẫn này chủ yếu dựa trên ví dụ. Bạn sẽ học được từ một số ví dụ mã trong suốtTrong hướng dẫn này, bạn sẽ học cách
Xuyên suốt hướng dẫn, bạn sẽ thấy các ví dụ về cách chơi với bộ máy nhập Python để hoạt động hiệu quả nhất. Mặc dù tất cả mã được hiển thị trong hướng dẫn, nhưng bạn cũng có thể tải xuống bằng cách nhấp vào hộp bên dưới Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này Python cơ bản >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 44Mã Python được tổ chức thành cả mô-đun và gói. Phần này sẽ giải thích chúng khác nhau như thế nào và bạn có thể làm việc với chúng như thế nào Ở phần sau của 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 của Python. Tuy nhiên, hãy bắt đầu với những điều cơ bản. nhập mô-đun và gói Loại bỏ các quảng cáomô-đuncon trăn. thuật ngữ org định nghĩa mô-đun như sau
Trong thực tế, một mô-đun thường tương ứng với một tệp 47 chứa mã PythonSứ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, 48, bạn nhập mã trong mô-đun 49 và cung cấp mã đó để sử dụng. Ở dòng thứ hai, bạn truy cập biến 50 trong mô-đun 49. 49 là một phần của thư viện chuẩn của Python, có nghĩa là nó luôn có sẵn để nhập khi bạn chạy PythonLưu ý rằng bạn viết 53 và không chỉ đơn giản là 50. Ngoài vai trò là một mô-đun, 49 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ữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters
Bạn có thể liệt kê nội dung của một không gian tên với 56>>>
Sử dụng 56 mà không có bất kỳ đối số nào sẽ hiển thị những gì trong không gian tên chung. Để xem nội dung của không gian tên 49, bạn sử dụng 59Bạn đã thấy cách sử dụng đơn giản nhất của 44. 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 mô-đun đóĐoạn mã sau chỉ nhập biến 50 từ mô-đun 49>>> 1Lưu ý rằng nơi này đặt 50 trong không gian tên chung chứ không phải trong không gian tên 49Bạn cũng có thể đổi tên các mô-đun và thuộc tính khi chúng được nhập >>> 4Để biết thêm chi tiết về cú pháp nhập mô-đun, hãy xem Mô-đun và Gói Python – Giới thiệu góiBạn có thể sử dụng một gói để tổ chức thêm các mô-đun của mình. con trăn. thuật ngữ org định nghĩa gói như sau
Lưu ý rằng một gói vẫn là một mô-đun. Là người dùng, bạn thường không cần phải lo lắng về việc bạn đang nhập mô-đun hay gói Trong thực tế, một gói thường tương ứng với một thư mục tệp chứa các tệp Python và các thư mục khác. Để tự tạo một gói Python, bạn tạo một thư mục và một tệp có tên 66 bên trong nó. Tệp 66 chứa nội dung của gói khi được coi là mô-đun. Nó có thể để trốngGhi chú. Các thư mục không có tệp 66 vẫn được Python coi là gói. Tuy nhiên, đây sẽ không phải là các gói thông thường, mà là một thứ gọi là gói không gian tên. Bạn sẽ tìm hiểu thêm về chúng sauNói chung, các mô-đun con và gói con không được nhập khi bạn nhập một gói. Tuy nhiên, bạn có thể sử dụng 66 để bao gồm bất kỳ hoặc tất cả các mô hình con và gói con nếu bạn muốn. Để hiển thị một vài ví dụ về hành vi này, bạn sẽ tạo một gói để nói 70 bằng một vài ngôn ngữ khác nhau. Gói này sẽ bao gồm các thư mục và tệp sau 1Mỗi tệp quốc gia in ra một lời chào, trong khi tệp 66 nhập có chọn lọc một số gói con và mô hình con. Nội dung chính xác của các tập tin như sau 3Lưu ý rằng 72 chỉ nhập khẩu 73 chứ không phải 74. Tương tự, 75 không nhập bất cứ thứ gì, trong khi 76 nhập 77 và 78 nhưng không nhập 79. Mỗi mô-đun quốc gia sẽ in lời chào khi được nhậpHãy chơi với gói 80 tại dấu nhắc tương tác để hiểu rõ hơn về cách hoạt động của các gói con và mô-đun con>>> 3Khi 74 được nhập, các mô-đun 82 và 83 cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập>>> 7Tệp 75 trống. Điều này có nghĩa là việc nhập gói 85 sẽ tạo không gian tên nhưng không có tác dụng nào khác>>> 0Remember, importing a module both loads the contents and creates a namespace containing the contents. The last few examples show that it’s possible for the same module to be part of different namespaces Technical Detail. The module namespace is implemented as a Python dictionary and is available at the 86 attribute>>> 2You rarely need to interact with 86 directlyTương tự, không gian tên toàn cục của Python cũng là một từ điển. You can access it through 88It’s fairly common to import subpackages and submodules in an 66 file to make them more readily available to your users. You can see one example of this in the popular 90 packageLoại bỏ các quảng cáoAbsolute and Relative ImportsRecall the source code of 72 in the earlier example 0Bạn đã từng thấy các câu lệnh của 92 chẳng hạn như 93, nhưng dấu chấm ( 94) trong 95 có nghĩa là gì?Dấu chấm đề cập đến gói hiện tại và câu lệnh là một ví dụ về nhập tương đối. Bạn có thể đọc nó là “Từ gói hiện tại, nhập gói phụ 73. ”There’s an equivalent absolute import statement in which you explicitly name the current package 1In fact, all imports in 80 could have been done explicitly with similar absolute importsRelative imports must be in the form 92, and the location you’re importing from must start with a dotThe PEP 8 style guide recommends using absolute imports in general. However, relative imports are an alternative for organizing package hierarchies. For more information, see Absolute vs Relative Imports in Python Python’s Import PathHow does Python find the modules and packages it imports? You’ll see more details about the mechanics of the Python import system later. For now, just know that Python looks for modules and packages in its import path. This is a list of locations that are searched for modules to import Note. When you type 99, Python will look for 100 a few different places before searching the import pathIn particular, it’ll look in a module cache to see if 100 has already been imported, and it’ll search among the built-in modulesYou’ll learn more about the full Python import machinery in a later section You can inspect Python’s import path by printing 102. Broadly speaking, this list will contain three different kinds of locations
Typically, Python will start at the beginning of the list of locations and look for a given module in each location until the first match. Since the script directory or the current directory is always first in this list, you can make sure that your scripts find your self-made modules and packages by organizing your directories and being careful about which directory you run Python from However, you should also be careful that you don’t create modules that shadow, or hide, other important modules. As an example, say that you define the following 49 module 2Sử dụng mô-đun này hoạt động như mong đợi >>> 3But this module also shadows the 49 module that’s included in the standard library. Thật không may, điều đó có nghĩa là ví dụ tra cứu giá trị của π trước đây của chúng tôi không còn hoạt động nữa>>> 4The problem is that Python now searches your new 49 module for 50 instead of searching the 49 module in the standard libraryĐể tránh những loại sự cố 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 mình. In particular, your top-level module and package names should be unique. Nếu 49 được định nghĩa là một mô-đun con trong một gói, thì nó sẽ không che khuất mô-đun tích hợpLoại bỏ các quảng cáoThí dụ. Structure Your ImportsMặc dù có thể tổ chức quá trình nhập của bạn bằng cách sử dụng thư mục hiện tại cũng như bằng cách thao tác với 103 và thậm chí là 102, nhưng quá trình này thường không theo quy tắc và dễ xảy ra lỗi. To see a typical example, consider the following application 5The app will re-create a given file structure by creating directories and empty files. Tệp 112 chứa tập lệnh chính và 113 là mô-đun thư viện có một số chức năng để xử lý tệp. Sau đây là một ví dụ về đầu ra từ ứng dụng, trong trường hợp này bằng cách chạy nó trong thư mục 114 6The two source code files as well as the automatically created 115 file are re-created inside a new directory named 116Now take a look at the source code. Chức năng chính của ứng dụng được xác định trong 112 7Trong các dòng 12 đến 16, bạn đọc đường dẫn gốc từ dòng lệnh. In the above example you use a dot, which means the current directory. This path will be used as the 118 of the file hierarchy that you’ll re-createCông việc thực tế xảy ra ở dòng 19 đến 23. Trước tiên, bạn tạo một đường dẫn duy nhất, 119, đây sẽ là gốc của hệ thống phân cấp tệp mới của bạn. Then you loop through all paths below the original 118 and re-create them as empty files inside the new file hierarchyFor manipulating paths like this, 121 in the standard library is quite useful. Để biết thêm chi tiết về cách nó được sử dụng, hãy xem Mô-đun 121 của Python 3. Thuần hóa hệ thống tập tinOn line 26, you call 123. You’ll learn more about the 124 test on line 25 later. Bây giờ, bạn nên biết rằng biến đặc biệt 125 có giá trị 126 bên trong các tập lệnh, nhưng nó lấy tên của mô-đun bên trong các mô-đun đã nhập. For more information on 125, check out Defining Main Functions in Python and What Does if name == “main” Do in Python?Note that you import 128 on line 8. This library module contains two utility functions 8 129 uses a counter to find a path that doesn’t already exist. In the app, you use it to find a unique subdirectory to use as the 119 of the re-created file hierarchy. Tiếp theo, 131 đảm bảo rằng 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 cách sử dụng 132Hãy xem lại việc nhập 128 9Nó 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 128 từ dự án 114, việc nhập là tuyệt đối. nó không bắt đầu bằng dấu chấm. Điều này có nghĩa là phải tìm thấy 128 trong đường dẫn nhập để quá trình nhập hoạt độngMay 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 của Python, vì vậy hiện tại nó hoạt động tốt. However, if your project gains some traction, then it may be used in other ways Ví dụ: ai đó có thể muốn nhập tập lệnh vào Jupyter Notebook và chạy tập lệnh từ đó. Hoặc họ có thể muốn sử dụng lại thư viện 128 trong một dự án khác. Họ thậm chí có thể tạo một tệp thực thi bằng PyInstaller để phân phối dễ dàng hơn. Unfortunately, any of these scenarios can create issues with the import of 128To see an example, you can follow the PyInstaller guide and create an entry point to your application. Thêm một thư mục bổ sung bên ngoài thư mục ứng dụng của bạn 10Trong thư mục bên ngoài, tạo tập lệnh điểm vào, 139 11This script will import 123 from your original script and run it. Note that 123 isn’t run when 114 is imported because of the 124 test on line 25 in 112. That means you need to run 123 explicitlyVề lý thuyết, điều này sẽ hoạt động tương tự như chạy ứng dụng trực tiếp 12Why didn’t that work? Suddenly, the import of 128 raises an errorVấn đề là khi khởi động ứng dụng bằng 139, bạn đã thay đổi vị trí của tập lệnh hiện tại, do đó, thay đổi đường dẫn nhập. 128 không còn trên đường dẫn nhập, vì vậy không thể nhập hoàn toànOne possible solution is to change Python’s import path 13Điều này hoạt động vì đường dẫn nhập bao gồm thư mục chứa 112 và 113. Vấn đề với phương pháp này là đường dẫn nhập của bạn có thể rất lộn xộn và khó hiểuTrên thực tế, bạn đang 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 tương đối ngầm định. 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 tương đối thay thế. Thay đổi quá trình nhập trong 112 như sau 14You can now start your app through the entry point script 15Unfortunately, you can no longer call the app directly 16Vấn đề là các lần nhập 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. Of course, you could go back and restore the absolute import before running the script directly, or you could even do some 153 acrobatics to import files absolutely or relatively depending on what worksThere’s even an officially sanctioned hack to make relative imports work in scripts. Thật không may, điều này cũng buộc bạn phải thay đổi 102 trong hầu hết các trường hợp. To quote Raymond Hettinger
Thật vậy, một giải pháp tốt hơn—và ổn định hơn—là sử dụng cùng với hệ thống nhập và đóng gói của Python và cài đặt dự án của bạn dưới dạng gói cục bộ bằng cách sử dụng 155Loại bỏ các quảng cáoCreate and Install a Local PackageWhen you install a package from PyPI, that package is available to all scripts in your environment. 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ách tương tự Creating a local package doesn’t involve much overhead. Đầu tiên, tạo các tệp 156 và 157 tối thiểu trong thư mục 114 bên ngoài 17Về lý thuyết, 159 và 160 có thể là bất cứ thứ gì bạn thích. However, they’ll be used by 155 when referring to your package, so you should choose values that are recognizable and don’t collide with other packages you useOne tip is to give all such local packages a common prefix like 162 or your username. 163 should list the directory or directories containing your source code. Sau đó, bạn có thể cài đặt gói cục bộ bằng cách sử dụng 155 18This command will install the package to your system. 114 will then be found on Python’s import path, meaning you can use it anywhere without having to worry about the script directory, relative imports, or other complications. Tùy chọn 166 có nghĩa là có thể chỉnh sửa, tùy chọn này rất quan trọng vì tùy chọn này cho phép bạn thay đổi mã nguồn của gói mà không cần cài đặt lạiGhi chú. This kind of setup file works great when you’re working with projects on your own. However, if you plan to share the code with others, then you should add some more information to your setup file Để biết thêm chi tiết về các tệp thiết lập, hãy xem Cách xuất bản Gói Python mã nguồn mở lên PyPI Giờ đây, 114 đã đượ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 19Điều này sẽ hoạt động bất kể bạn kết thúc cuộc gọi ứng dụng của mình như thế nào Mẹo. In your own code, you should consciously separate scripts and libraries. Đây là một quy tắc tốt
You might have code that you want to both run on its own and import from other scripts. Trong trường hợp đó, thường đáng để cấu trúc lại mã của bạn để bạn chia phần chung thành một mô-đun thư viện While it’s a good idea to separate scripts and libraries, all Python files can be both executed and imported. 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ênPython modules and packages are very closely related to files and directories. Điều này khiến Python khác biệt với nhiều ngôn ngữ lập trình khác, trong đó các gói chỉ hoạt động như các không gian tên mà không thực thi cách tổ chức mã nguồn. See the discussion in PEP 402 for examples Namespace packages have been available in Python since version 3. 3. These are less dependent on the underlying file hierarchy. In particular, namespace packages can be split across multiple directories. A namespace package is created automatically if you have a directory containing a 47 file but no 66. See PEP 420 for a detailed explanationGhi chú. Nói chính xác, các gói không gian tên ẩn đã được giới thiệu trong Python 3. 3. Trong các phiên bản trước của Python, bạn có thể tạo thủ công các gói không gian tên theo một số cách không tương thích khác nhau. PEP 420 unifies and simplifies these earlier approaches Để 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 thử triển khai một. As a motivating example, you’ll have another go at the problem solved in The Factory Method Pattern and Its Implementation in Python. được cung cấp một đối tượng 170, bạn muốn chuyển đổi nó thành một trong số các 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 170Để cụ thể hơn, bạn muốn triển khai mã hoạt động giống như thế này >>> 40Let’s assume that you’re lucky and come across a third-party implementation of several of the formats that you need to serialize to, and it’s organized as a namespace package 41The file 172 contains code that can serialize an object to the JSON format 42This serializer interface is a bit limited, but it’ll be enough to demonstrate how namespace packages work Tệp 173 chứa một 174 tương tự có thể chuyển đổi một đối tượng thành XML 43Lưu ý rằng cả hai lớp này đều triển khai cùng một giao diện với các phương thức 175, 176 và 177Sau đó, bạn tạo một lớp 170 có thể sử dụng các bộ nối tiếp này 44Một 170 được xác định bởi ID, tiêu đề và nghệ sĩ của nó. Lưu ý rằng 180 không cần biết nó chuyển đổi sang định dạng nào 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 181 của bên thứ ba, bạn có thể sử dụng nó như sau>>> 45By providing different serializer objects to 180, you get different representations of your songNote. Bạn có thể nhận được một 183 hoặc một 184 khi tự chạy mã. Điều này là do 181 không có trong đường dẫn nhập Python của bạn. Bạn sẽ sớm biết cách giải quyết vấn đề đó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 sang biểu diễn YAML, không được hỗ trợ trong thư viện của bên thứ ba. Nhập sự kỳ diệu của các gói không gian tên. bạn có thể thêm 186 của riêng mình vào gói 181 mà không cần chạm vào thư viện của bên thứ baĐầu tiên, 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à 181. Điều quan trọng là tên của thư mục phải khớp với tên của gói không gian tên mà bạn đang tùy chỉnh 46Trong tệp 189, bạn xác định 186 của riêng mình. Bạn căn cứ vào gói 191, gói này phải được cài đặt từ PyPI 47Vì YAML và JSON có các định dạng khá giống nhau nên bạn có thể sử dụng lại hầu hết việc triển khai của 192 48Lưu ý rằng 186 dựa trên 192, được nhập từ chính 181. Vì cả 196 và 197 đều 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. 198Tiếp tục ví dụ trên, bây giờ bạn cũng có thể chuyển đổi bài hát sang YAML >>> 49Cũng giống như các gói và mô-đun 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 đang làm theo các ví dụ trước, thì bạn có thể đã gặp sự cố với việc Python không tìm thấy 181. Trong mã thực tế, bạn sẽ sử dụng 155 để cài đặt thư viện của bên thứ ba, do đó, nó sẽ tự động nằm trong đường dẫn của bạnGhi chú. Trong ví dụ ban đầu, việc lựa chọn bộ nối tiếp được thực hiện linh hoạt hơn. Bạn sẽ thấy cách sử dụng các gói không gian tên theo mẫu phương thức xuất xưởng thích hợp sau này Bạn cũng nên đảm bảo rằng thư viện cục bộ của mình có sẵn như một gói thông thường. Như đã giải thích ở trên, bạn có thể thực hiện việc 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 155 để cài đặt thư viện cục bộ.Trong ví dụ này, bạn đang kiểm tra cách tích hợp gói bên thứ ba giả mạo với gói cục bộ của mình. Nếu 402 là một gói thực, thì bạn sẽ tải xuống từ PyPI bằng cách sử dụng 155. Vì điều này là không thể, bạn có thể mô phỏng nó bằng cách cài đặt 402 cục bộ giống như bạn đã làm trong ví dụ 114 trước đóNgoài ra, bạn có thể gây rối với đường dẫn nhập của mình. Đặt các thư mục 402 và 407 trong cùng một thư mục, sau đó tùy chỉnh đường dẫn Python của bạn như sau>>> 10Giờ đây, bạn có thể sử dụng tất cả các bộ nối tiếp mà không phải lo lắng về việc chúng được xác định trong gói của bên thứ ba hay cục bộ Loại bỏ các quảng cáoHướng dẫn phong cách nhập khẩuPEP 8, the Python style guide, has a couple of recommendations about imports. As always with Python, keeping your code both readable and maintainable is an important consideration. Here are a few general rules of thumb for how to style your imports
409 và 410 là những công cụ tuyệt vời để thực thi một phong cách nhất quán đối với hàng nhập của bạnĐây là một ví dụ về phần nhập bên trong gói trình đọc nguồn cấp Python thực 11Lưu ý cách nhóm này làm cho các phụ thuộc của mô-đun này rõ ràng. 411 and 412 need to be installed on the system. You can generally assume that the standard library is available. Việc tách nhập khẩu 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ạnThere are cases in which it makes sense to bend these rules a little. You’ve already seen that relative imports can be an alternative to organizing package hierarchies. Later, you’ll see how in some cases you can move imports into a function definition to break import cycles Resource ImportsĐôi khi, bạn sẽ có mã phụ thuộc vào tệp dữ liệu hoặc các tài nguyên khác. In small scripts, this isn’t a problem—you can specify the path to your data file and carry on However, if the resource file is important for your package and you want to distribute your package to other users, then a few challenges will arise
There have been several attempts at solving these challenges, including 416. However, with the introduction of 417 into the standard library in Python 3. 7, there’s now one standard way of dealing with resource filesGiới thiệu >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 417 417 cấp quyền truy cập vào tài nguyên trong các gói. In this context, a 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ế. By reusing the import system, you get a more consistent way of dealing with the files inside your packages. It also gives you easier access to resource files in other packages. The documentation sums it up nicely
417 became part of the standard library in Python 3. 7. However, on older versions of Python, a backport is available as 421. Để sử dụng backport, hãy cài đặt nó từ PyPI 12Backport tương thích với Python 2. 7 cũng như Python 3. 4 and later versions There’s one requirement when using 417. các tệp tài nguyên của bạn phải có sẵn bên trong một gói thông thường. Gói không gian tên không được hỗ trợ. Trong thực tế, điều này có nghĩa là tệp phải nằm trong thư mục chứa tệp 66As a first example, assume you have resources inside a package like this 13 66 chỉ là một tệp trống cần thiết để chỉ định 425 như một gói thông thườngSau đó, bạn có thể sử dụng 426 và 427 để mở tệp văn bản và tệp nhị phân tương ứng>>> 14 426 và 427 tương đương với 430 tích hợp với tham số 431 được đặt lần lượt là 432 và 433. Các chức năng thuận tiện để đọc văn bản hoặc tệp nhị phân trực tiếp cũng có sẵn như 434 và 435. Xem tài liệu chính thức để biết thêm thông tinGhi chú. Để liên tục quay lại sử dụng backport trên các phiên bản Python cũ hơn, bạn có thể nhập 417 như sau 15Xem phần mẹo và thủ thuật của hướng dẫn này để 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 số ví dụ phức tạp về việc sử dụng tệp tài nguyên trong thực tế Loại bỏ các quảng cáoThí dụ. Sử dụng tệp dữ liệuLà một ví dụ đầy đủ hơn về việc sử dụng tệp dữ liệu, bạn sẽ thấy cách triển khai chương trình đố vui dựa trên dữ liệu dân số của Liên hợp quốc. Đầu tiên, tạo gói 437 và tải xuống 438 từ trang web của Liên hợp quốc 16Mở tệp CSV và xem dữ liệu 17Mỗ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 biết loại kịch bản nào được sử dụng để chiếu. Tệp chứa dự báo dân số cho đến năm 2100 Hàm sau đọc tệp này và chọn ra tổng dân số của mỗi quốc gia cho một 439 và 440 nhất định 18Các dòng được đánh dấu cho biết cách sử dụng 417 để mở tệp dữ liệu. Để biết thêm thông tin về cách làm việc với tệp CSV, hãy xem Đọc và ghi tệp CSV bằng PythonHàm trên trả về một từ điển có số dân >>> 19Bạn có thể thực hiện bất kỳ điều thú vị nào với từ điển dân số này, bao gồm phân tích và trực quan hóa. Tại đây, bạn sẽ tạo một trò chơi đố vui yêu cầu người dùng xác định quốc gia nào trong nhóm đông dân nhất. Chơi trò chơi sẽ giống như thế này 30Các chi tiết của việc triển khai nằm quá xa chủ đề của hướng dẫn này, vì vậy chúng sẽ không được thảo luận ở đây. Tuy nhiên, bạn có thể mở rộng phần bên dưới để xem mã nguồn hoàn chỉnh Mã nguồn của bài kiểm tra dân sốHiển thị/Ẩn Bài kiểm tra dân số bao gồm hai chức năng, một chức năng đọc dữ liệu dân số như bạn đã làm ở trên và một chức năng chạy bài kiểm tra thực tế 31Lưu ý rằng ở dòng 24, bạn cũng kiểm tra xem ________ 2442 có nhỏ hơn ________ 2443 không. Các vị trí có 442 trong số 443 trở lên không phải là quốc gia thích hợp, mà là các tập hợp như 446, 447, v.v.Thí dụ. Thêm biểu tượng vào GUI TkinterKhi xây dựng giao diện người dùng đồ họa (GUI), bạn thường cần bao gồm các tệp tài nguyên như biểu tượng. Ví dụ sau đây cho thấy cách bạn có thể làm điều đó bằng cách sử dụng 417. Ứng dụng cuối cùng sẽ trông khá cơ bản, nhưng nó sẽ có biểu tượng tùy chỉnh cũng như hình minh họa trên nút Tạm biệtVí dụ sử dụng Tkinter, một gói GUI có sẵn trong thư viện chuẩn. Nó dựa trên hệ thống cửa sổ Tk, ban đầu được phát triển cho ngôn ngữ lập trình Tcl. Có nhiều gói GUI khác có sẵn cho Python. Nếu bạn đang sử dụng một ứng dụng khác, thì bạn có thể thêm các biểu tượng vào ứng dụng của mình bằng các ý tưởng tương tự như những ý tưởng được trình bày ở đây Trong Tkinter, hình ảnh được xử lý bởi lớp 449. Để tạo một 449, bạn chuyển vào một đường dẫn đến một tệp hình ảnhHã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 tệp vật lý trên hệ thống tệp. 417 giải quyết vấn đề này bằng cách cung cấp 452. Hàm này sẽ trả về đường dẫn đến tệp tài nguyên, tạo tệp tạm thời nếu cầnĐể đảm bảo mọi tệp tạm thời được dọn sạch đúng cách, bạn nên sử dụng 452 làm trình quản lý ngữ cảnh bằng từ khóa 454>>> 32Đối với ví dụ đầy đủ, giả sử bạn có hệ thống phân cấp tệp sau 33Nế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 Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này Mã được lưu trữ trong một tệp có tên đặc biệt 455. Tên này chỉ ra rằng tệp là điểm vào cho gói. Có tệp 455 cho phép gói của bạn được thực thi với 457 34Để biết thêm thông tin về cách gọi gói bằng 458, hãy xem Cách xuất bản Gói Python nguồn mở lên PyPIGUI được định nghĩa trong một lớp có tên là 459. Lưu ý rằng bạn sử dụng 417 để lấy đường dẫn của tệp hình ảnh 35Nếu bạn muốn tìm hiểu thêm về cách xây dựng GUI với Tkinter, hãy xem Lập trình GUI Python với Tkinter. Tài liệu chính thức cũng có một danh sách tài nguyên hay để 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 biết cách sử dụng Tk trong các ngôn ngữ khác Ghi chú. Một nguyên nhân gây nhầm lẫn và thất vọng khi làm việc với hình ảnh trong Tkinter là bạn phải đảm bảo hình ảnh không bị thu gom rác. Do cách Python và Tk tương tác, trình thu gom rác trong Python (ít nhất là trong CPython) không đăng ký rằng hình ảnh được sử dụng bởi 461 và 462Để đảm bảo rằng hình ảnh được lưu giữ xung quanh, bạn nên thêm tham chiếu đến chúng theo cách thủ công. Bạn có thể xem các ví dụ về điều này trong đoạn mã trên ở dòng 18 và 31 Loại bỏ các quảng cáoNhập độ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 đó là một ý tưởng tồi, nhưng bạn có thể thực hiện nhiều việc với chương trình Python khi nó đang chạy, bao gồm thêm thuộc tính vào lớp, xác định lại phương thức hoặc thay đổi chuỗi tài liệu của mô-đun. Chẳng hạn, bạn có thể thay đổi 463 để nó không làm gì cả>>> 36Về mặt kỹ thuật, bạn không định nghĩa lại 463. Thay vào đó, bạn đang xác định một 463 khác che khuất cái tích hợp sẵn. Để quay lại sử dụng 463 ban đầu, bạn có thể xóa tùy chỉnh của mình bằng 467. Nếu muốn, bạn có thể tạo bóng cho bất kỳ đối tượng Python nào được tích hợp trong trình thông dịchGhi chú. Trong ví dụ trên, bạn xác định lại 463 bằng hàm lambda. Bạn cũng có thể đã sử dụng một định nghĩa chức năng bình thường>>> 37Để tìm hiểu thêm về các hàm lambda, hãy xem Cách sử dụng các hàm Lambda của Python Trong phần này, bạn sẽ tìm hiểu cách nhập động trong Python. Với chúng, bạn sẽ không phải quyết định nhập nội dung gì cho đến khi chương trình của bạn đang chạy Sử dụng >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 469Cho đến giờ, bạn đã sử dụng từ khóa 44 của Python để 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 469 và điều này cho phép bạn thực hiện việc nhập khẩu của mình linh hoạt hơn. Đoạn script sau hỏi người dùng tên của một mô-đun, nhập mô-đun đó và in chuỗi tài liệu của nó 38 472 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 đó là một mô-đun được nhập thường xuyên. Bạn có thể sử dụng kịch bản như thế này 39Trong mỗi trường hợp, mô-đun được nhập động bởi 472Thí dụ. Phương thức xuất xưởng với các gói không gian tênThink back to the serializers example from earlier. Với 181 được triển khai dưới dạng gói không gian tên, bạn có khả năng thêm các bộ nối tiếp tùy chỉnh. Trong ví dụ ban đầu từ hướng dẫn trước, các bộ nối tiếp được cung cấp thông qua một nhà máy sản xuất bộ nối tiếp. Sử dụng 469, bạn có thể làm điều gì đó tương tựThêm mã sau vào gói không gian tên 181 cục bộ của bạn 30Nhà máy 477 có thể tự động tạo bộ nối tiếp dựa trên tham số 478 và sau đó, 479 có thể áp dụng bộ nối tiếp cho bất kỳ đối tượng nào triển khai phương thức 180The factory makes some strong assumptions about the naming of both the module and the class containing the individual serializers. In the next section, you’ll learn about a plugin architecture that allows more flexibility You can now re-create the earlier example as follows >>> 31In this case, you no longer need to explicitly import each serializer. Instead, you specify the name of a serializer with a string. The string could even be chosen by your user at runtime Note. In a regular package, you probably would have implemented 477 and 479 in an 66 file. That would have allowed you to simply import 181 and then call 485However, namespace packages aren’t allowed to use 66, so you need to implement these functions in a separate module insteadThe final example shows that you also get a decent error message if you try to serialize to a format that hasn’t been implemented Loại bỏ các quảng cáoExample. A Package of PluginsLet’s look at another example of using dynamic imports. You can use the following module to set up a flexible plugin architecture in your code. This is similar to the previous example, in which you could plug in serializers for different formats by adding new modules One application that uses plugins effectively is the Glue exploratory visualization tool. Glue can read many different data formats out of the box. However, if your data format isn’t supported, then you can write your own custom data loader You do this by adding a function that you decorate and place in a special location to make it easy for Glue to find. You don’t need to alter any part of the Glue source code. See the documentation for all the details You can set up a similar plugin architecture that you can use in your own projects. Within the architecture, there are two levels
The 487 module that exposes the plugin architecture has the following functions 32The factory functions are used to conveniently add functionality to plugin packages. You’ll see some examples of how they’re used shortly Looking at all the details of this code is outside the scope of this tutorial. If you’re interested, then you can see an implementation by expanding the section below Mã nguồn hoàn chỉnh của plugin. pyShow/Hide The following code shows the implementation of 488 described above 33This implementation is a bit simplified. In particular, it doesn’t do any explicit error handling. Check out the PyPlugs project for a more complete implementation You can see that 489 uses 490 to dynamically load plugins. Additionally, 491 uses 492 to list all available plugins in a given packageLet’s look at some examples of how to use plugins. The first example is a 493 package that you can use to add many different greetings to your app. A full plugin architecture is definitely overkill for this example, but it shows how the plugins workAssume you have the following 493 package 34Each 493 module defines a function that takes one 159 argument. Note how they’re all registered as plugins using the 497 decorator 35To learn more about decorators and how they’re used, check out Primer on Python Decorators Note. To simplify the discovery and import of plugins, each plugin’s name is based on the name of the module that contains it instead of the function name. This restricts you to having only one plugin per file To finish setting up 493 as a plugin package, you can use the factory functions in 487 to add functionality to the 493 package itself 36You can now use 101 and 102 as follows>>> 37Note that 101 automatically discovers all the plugins that are available in the packageYou can also more dynamically choose which plugin to call. In the following example, you choose a plugin at random. However, you could also select a plugin based on a configuration file or user input >>> 38To discover and call the different plugins, you need to import them. Let’s have a quick look at how 487 handles imports. The main work is done in the following two functions inside 488 39 489 looks deceptively straightforward. It uses 469 to import a module. But there are a couple of things also happening in the background
491 discovers all the plugins within a package. Here’s how it works
Let’s end this section with a final version of the serializers namespace package. Một vấn đề nổi bật là nhà máy 477 đã đưa ra các giả định mạnh mẽ về việc đặt tên cho các lớp bộ nối tiếp. Bạn có thể làm cho điều này linh hoạt hơn bằng cách sử dụng pluginĐầu tiên, thêm một dòng đăng ký từng bộ nối tiếp. Đây là một ví dụ về cách nó được thực hiện trong bộ nối tiếp 197 70Tiếp theo, cập nhật 114 để sử dụng 487 71Bạn triển khai 477 bằng cách sử dụng 117 vì điều đó sẽ tự động khởi tạo từng bộ nối tiếp. With this refactoring, the serializers work just the same as earlier. Tuy nhiên, bạn có thể linh hoạt hơn trong việc đặt tên cho các lớp serializer của mìnhĐể biết thêm thông tin về cách sử dụng plugin, hãy xem PyPlugs trên PyPI và các Trình cắm. 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 Loại bỏ các quảng cáoHệ thống nhập PythonBạn đã thấy nhiều cách để tận dụng hệ thống nhập của Python. Trong phần này, bạn sẽ tìm hiểu thêm một chút về những gì diễn ra ở hậu trường khi các mô-đun và gói được nhập 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 các tệp dữ liệu như thể chúng là các mô-đun Nhập nội bộChi tiết về hệ thống nhập Python được mô tả trong tài liệu chính thức. Ở cấp độ cao, có ba điều xảy ra khi bạn nhập một mô-đun (hoặc gói). The module is
Đối với các thao tác nhập thông thường—những thao tác được thực hiện với câu lệnh 44—cả ba bước diễn ra tự động. Tuy nhiên, khi bạn sử dụng 469, chỉ có hai bước đầu tiên là tự động. You need to bind the module to a variable or namespace yourselfChẳng hạn, các phương pháp nhập và đổi tên 53 sau đây gần như tương đương>>> 72Tất nhiên, trong mã bình thường, bạn nên chọn 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ô-đun, toàn bộ mô-đun sẽ được tải và thực thi. Phần còn lại của nội dung mô-đun không bị ràng buộc với không gian tên hiện tại. Một cách để chứng minh điều này là xem cái được gọi là bộ đệm mô-đun >>> 73 121 hoạt động như một bộ đệm mô-đun. It contains references to all modules that have been importedBộ đệm mô-đun đóng một vai trò rất quan trọng trong hệ thống nhập Python. Nơi đầu tiên Python tìm kiếm các mô-đun khi thực hiện nhập là trong 121. Nếu một mô-đun đã có sẵn, thì nó sẽ không được tải lạiThis is a great optimization, but it’s also a necessity. Nếu các mô-đun được tải lại mỗi khi chúng được nhập, thì bạn có thể gặp phải tình trạng không nhất quán trong một số trường hợp 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 Recall the import path you saw earlier. It essentially tells Python where to search for modules. However, if Python finds a module in the module cache, then it won’t bother searching the import path for the module Thí dụ. Singletons as ModulesIn object-oriented programming, a 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ụ: hãy quay lại dữ liệu dân số của Liên hợp quốc mà bạn đã xem trước đó. Mô-đun sau định nghĩa một lớp bao bọc dữ liệu dân số 74Đọc dữ liệu từ đĩa mất một thời gian. Vì bạn không muốn tệp dữ liệu thay đổi, nên bạn khởi tạo lớp khi bạn tải mô-đun. The name of the class starts with an underscore to indicate to users that they shouldn’t use it Bạn có thể sử dụng đơn lẻ 123 để tạo biểu đồ Matplotlib hiển thị dự báo dân số cho các quốc gia đông dân nhất>>> 75Điều này tạo ra một biểu đồ như sau Note that loading the data at import time is a kind of antipattern. Lý tưởng nhất là bạn muốn hàng nhập khẩu của mình không có tác dụng phụ nhất có thể. A better approach would be to load the data lazily when you need it. You can do this quite elegantly using properties. Mở rộng phần sau để xem ví dụ Lazily Loading Population DataShow/Hide Việc triển khai lười biếng của 124 lưu trữ dữ liệu dân số trong 125 lần đầu tiên nó được đọc. The 126 property handles this caching of data 76Bây giờ dữ liệu sẽ không được tải khi nhập. Thay vào đó, nó sẽ được nhập vào lần đầu tiên bạn truy cập từ điển 127. For more information about properties and the more general concept of descriptors, see Python Descriptors. Một lời giới thiệuLoại bỏ các quảng cáoTải lại mô-đunThe module cache can be a little frustrating when you’re working in the interactive interpreter. It’s not trivial to reload a module after you change it. Ví dụ: hãy xem mô-đun sau 77Là một phần của quá trình thử nghiệm và gỡ lỗi mô-đun này, bạn nhập nó vào bảng điều khiển Python >>> 78Giả sử bạn nhận ra rằng bạn có một lỗi trong mã của mình, vì vậy bạn cập nhật tệp 128 trong trình chỉnh sửa của mình 79Returning to your console, you import the updated module to see the effect of your fix >>> 78Tại sao câu trả lời vẫn là 129? . since Python imported 130 earlier, it sees no reason to load the module again even though you just changed itThe most straightforward solution to this is to exit the Python console and restart it. Điều này buộc Python cũng phải xóa bộ đệm mô-đun của nó >>> 01Tuy nhiên, khởi động lại trình thông dịch không phải lúc nào cũng khả thi. You might be in a more complicated session that has taken you a long time to set up. Nếu đúng như vậy, bạn có thể sử dụng 131 để tải lại một mô-đun thay thế>>> 02Lưu ý rằng 132 yêu cầu đối tượng mô-đun, không phải chuỗi như 472. Ngoài ra, hãy lưu ý rằng 132 có một số lưu ý. In particular, variables referring to objects within a module are not re-bound to new objects when that module is reloaded. Xem tài liệu để biết thêm chi tiếtFinders and LoadersBạ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ể gây ra sự cố. Ví dụ: nếu bạn có một tệp có tên 135 trong đường dẫn nhập của Python, thì bạn sẽ không thể nhập 49 từ thư viện chuẩnĐiều này không phải luôn luôn như vậy, mặc dù. Tạo một tệp có tên 137 với nội dung sau 03Next, open a Python interpreter and import this new module >>> 04Something weird happened. It doesn’t seem like Python imported your new 138 module. Instead, it imported the 138 module from the standard library. Why are the standard library modules behaving inconsistently? You can get a hint by inspecting the modules>>> 05You can see that 49 is imported from a file, whereas 138 is some kind of built-in module. It seems that built-in modules aren’t shadowed by local onesNote. The built-in modules are compiled into the Python interpreter. Typically, they’re foundational modules like 142, 143, and 138. Which modules are built in depends on your Python interpreter, but you can find their names in 145Let’s dig even deeper into Python’s import system. This will also show why built-in modules aren’t shadowed by local ones. There are several steps involved when importing a module
Bạn có thể mở rộng hệ thống nhập Python bằng cách triển khai công cụ tì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ề công cụ tìm sau. 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 147 kiểm soát công cụ tìm nào được gọi trong quá trình nhập>>> 06First, note that this answers the question from earlier. built-in modules aren’t shadowed by local modules because the built-in finder is called before the import path finder, which finds local modules. Thứ hai, lưu ý rằng bạn có thể tùy chỉnh 147 theo ý thích của mìnhĐể nhanh chóng làm 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 >>> 07Since there are no finders, Python can’t find or import new modules. Tuy nhiên, Python vẫn có thể nhập các mô-đun đã có trong bộ đệm mô-đun vì nó tìm ở đó trước khi gọi bất kỳ công cụ tìm nào In the example above, 469 was already loaded under the hood before you cleared the list of finders. Nếu bạn thực sự muốn làm cho phiên Python của mình hoàn toàn không sử dụng được, thì bạn cũng có thể xóa bộ đệm mô-đun, 121The following is a slightly more useful example. You’ll write a finder that prints a message to the console identifying the module being imported. Ví dụ này cho thấy cách thêm công cụ tì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 08Tất cả các công cụ tìm phải triển khai một phương thức lớp 151, phương thức này sẽ cố gắng tìm một mô-đun nhất định. Có ba cách mà 151 có thể chấm dứt
155 in một thông báo tới bảng điều khiển và sau đó trả về một cách rõ ràng 153 để chỉ ra rằng những người tìm kiếm khác nên tìm ra cách thực sự nhập mô-đunGhi chú. Vì Python hoàn toàn trả về 153 từ bất kỳ hàm hoặc phương thức nào mà không có 158 rõ ràng, bạn có thể bỏ qua dòng 9. Tuy nhiên, trong trường hợp này, tốt nhất là thêm vào 159 để làm rõ rằng 155 không tìm thấy mô-đunBằng cách chèn 155 trước vào danh sách công cụ tìm, bạn sẽ có một danh sách đang chạy gồm tất cả các mô-đun đang được nhập>>> 09Ví dụ: bạn có thể thấy rằng việc nhập 162 sẽ kích hoạt việc nhập một số mô-đun khác mà 162 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, 164, cung cấp thông tin tương tự và nhiều, nhiều hơn nữaVí dụ khác, giả sử bạn đang thực hiện nhiệm vụ loại bỏ thế giới của các biểu thức thông thường. (Bây giờ, tại sao bạn lại muốn một thứ như vậy? Cụm từ thông dụng thật tuyệt. ) Bạn có thể triển khai công cụ tìm sau cấm mô-đun biểu thức chính quy 165 20Raising a 183 ensures that no finder later in the list of finders will be executed. Điều này thực sự ngăn bạn sử dụng các biểu thức thông thường trong Python>>> 21Mặc dù bạn chỉ đang nhập 162, nhưng mô-đun đó đang nhập 165 ở hậu trường, do đó sẽ xảy ra lỗiThí dụ. Tự động cài đặt từ PyPIBecause the Python import system is already quite powerful and useful, there are many more ways to mess it up than there are to extend it in a useful way. Tuy nhiên, ví dụ sau có thể hữu ích trong một số trường hợp Chỉ mục gói Python (PyPI) là cửa hàng pho mát duy nhất của bạn để tìm các gói và mô-đun của bên thứ ba. Đây cũng là nơi mà các gói tải xuống của 155Trong các hướng dẫn Real Python khác, bạn có thể đã xem hướng dẫn sử dụng 170 để cài đặt các mô-đun và gói của bên thứ ba mà bạn cần để làm theo cùng với các ví dụ. Wouldn’t it be great to have Python automatically install missing modules for you?Warning. Trong hầu hết các trường hợp, sẽ không tuyệt lắm nếu Python tự động cài đặt các mô-đun. For instance, in most production settings you want to stay in control of your environment. Furthermore, the documentation cautions against using 155 this wayĐể tránh làm rối cài đặt Python của bạn, bạn chỉ nên sử dụng mã này trong các môi trường mà bạn không ngại xóa hoặc cài đặt lại The following finder attempts to install modules using 155 22So với các công cụ tìm bạn đã thấy trước đó, công cụ này phức tạp hơn một chút. By putting this finder last in the list of finders, you know that if you call 173, then the module won’t be found on your system. Do đó, công việc của 151 chỉ là thực hiện 175. Nếu quá trình 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 176 mà không cần tự cài đặt>>> 23Thông thường, 177 sẽ tăng một 183, nhưng trong trường hợp này, 176 được cài đặt và nhậpWhile the 173 seemingly works, there are some challenges with this approach. 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ụ: trình đọc nguồn cấp Python thực có tên là 181 trên PyPI, nhưng tên nhập chỉ đơn giản là 182Sử dụng 173 để nhập và cài đặt 182 kết thúc bằng việc cài đặt sai gói>>> 24Điều này có thể gây hậu quả tai hại cho dự án của bạn One situation in which automatic installations can be quite helpful is when you’re running Python in the cloud with more limited control over your environment, such as when you’re running Jupyter-style notebooks at Google Colaboratory. Môi trường sổ ghi chép Colab rất phù hợp để thực hiện khám phá 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 bằng 155. But you can also activate automatic installationVì 186 không có sẵn cục bộ trên máy chủ Colab nên mã này được sao chép vào ô đầu tiên của sổ ghi chépExample. 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 hầu hết mọi thứ bằng Python. Giới thiệu về Trình tải và Trình tìm mô-đun. You’ve already seen how to use 417 to import datafiles. Tại đây, thay vào đó, bạn sẽ triển khai trình tải tùy chỉnh có thể nhập trực tiếp tệp CSVTrước đó, bạn đã làm việc với một tệp CSV khổng lồ chứa dữ liệu dân số. Để làm cho ví dụ về trình tải tùy chỉnh dễ quản lý hơn, hãy xem xét tệp 188 nhỏ hơn sau đây 25The first line is a header naming three fields, and the following two rows of data each contain information about an employee. Để biết thêm thông tin về cách làm việc với tệp CSV, hãy xem Đọc và ghi tệp CSV bằng Python Mục tiêu của bạn trong phần này là viết một công cụ tìm và một trình tải cho phép bạn nhập tệp CSV trực tiếp để bạn có thể viết mã như sau >>> 26The job of the finder will be to search for and recognize CSV files. 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 các trình tìm và trình tải tương ứng trong một lớp chung. Đó là cách tiếp cận bạn sẽ thực hiện ở đây 27Có khá nhiều mã trong ví dụ này. May mắn thay, hầu hết công việc được thực hiện trong 151 và 190. Hãy xem xét chúng chi tiết hơnNhư bạn đã thấy trước đó, 151 chịu trách nhiệm tìm mô-đun. Trong trường hợp này, bạn đang tìm tệp CSV, vì vậy bạn tạo tên tệp có hậu tố 192. 159 chứa tên đầy đủ của mô-đun được nhập. For example, if you use 194, then 159 will be 196. Trong trường hợp này, tên tệp sẽ là 188For top-level imports, 198 will be 153. Trong trường hợp đó, bạn tìm tệp CSV trong đường dẫn nhập đầy đủ, đường dẫn nà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 một gói, thì 198 sẽ được đặt thành đường dẫn hoặc nhiều đường dẫn của gói. Nếu bạn tìm thấy tệp CSV phù hợp, thì thông số mô-đun sẽ được trả về. Thông số mô-đun này yêu cầu Python tải mô-đun bằng cách sử dụng 301Dữ liệu CSV được tải bởi 190. Bạn có thể sử dụng 303 từ thư viện chuẩn để thực hiện phân tích cú pháp tệp thực tế. 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 304, bạn cung cấp dữ liệu đó dưới dạng thuộc tính của mô-đunChẳng hạn, thêm 305 vào từ điển mô-đun ở dòng 44 cho phép bạn liệt kê các tên trường trong tệp CSV như sau>>> 28Nói chung, tên trường CSV có thể chứa khoảng trắng và các ký tự khác không được 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 làm sạch tên trường bằng biểu thức chính quy. This is done in 306 starting on line 51Bạn có thể xem ví dụ về hiệu ứng này trong tên trường 307 ở trên. Nếu xem tệp CSV gốc, bạn sẽ thấy tiêu đề có nội dung 308 với dấu cách thay vì dấu gạch dướiBằng cách kết nối 301 này vào hệ thống nhập Python, bạn sẽ nhận được khá nhiều chức nă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ầnMẹo và thủ thuật nhập khẩuTo round out this tutorial, you’ll see a few tips about how to handle certain situations that come up from time to time. Bạn sẽ thấy cách xử lý các gói bị thiếu, nhập theo chu kỳ và thậm chí cả các gói được lưu trữ bên trong 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. You’ve already seen one example of this. 417 chỉ khả dụng kể từ Python 3. 7. Trong các phiên bản Python cũ hơn, bạn cần cài đặt và sử dụng 421 để 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ý vấn đề này bằng cách đổi tên gói thành 312 15Trong phần còn lại của mã, bạn có thể tham khảo 313 và không phải lo lắng về việc bạn đang sử dụng 417 hay 421Thông thường, cách dễ nhất là sử dụng câu lệnh 153 để 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ảnYou could rewrite the previous example as follows 00Điều này sẽ sử dụng 417 trên Python 3. 7 and newer while falling back to 421 on older versions of Python. Xem dự án 319 để có lời khuyên hữu ích và phù hợp với tương lai về cách kiểm tra phiên bản Python nào đang chạyXử lý các gói bị thiếu. Use an AlternativeTrường hợp sử dụng sau có liên quan chặt chẽ với ví dụ trước. Giả sử có một gói triển khai lại tương thích. The reimplementation is better optimized, so you want to use it if it’s available. Tuy nhiên, gói ban đầu có sẵn dễ dàng hơn và cũng mang lại hiệu suất chấp nhận được Một ví dụ như vậy là 320, đây là phiên bản được tối ưu hóa của 321 từ thư viện 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 đó 01Điều này sẽ sử dụng 320 nếu nó có sẵn và quay trở lại 321 nếu khôngMột ví dụ tương tự khác là gói UltraJSON, một bộ mã hóa và giải mã JSON cực nhanh có thể được sử dụng để thay thế cho 196 trong thư viện chuẩn 02Bằng cách đổi tên 325 thành 196, bạn không phải lo lắng về gói hàng nào thực sự được nhập khẩuXử lý các gói bị thiếu. Sử dụng Mock thay thếA third, related example is adding a package that provides a nice-to-have feature that’s not strictly necessary for your app. Một lần nữa, điều này có thể được giải quyết bằng cách thêm 153 vào mục nhập của bạn. Thử thách bổ sung là bạn sẽ thay thế gói tùy chọn như thế nào nếu không có sẵnVí dụ cụ thể, giả sử bạn đang sử dụng Colorama để thêm văn bản màu trong bảng điều khiển. Colorama chủ yếu bao gồm các hằng số chuỗi đặc biệt có thêm màu khi in >>> 03Unfortunately, the color doesn’t render in the example above. 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ắt đầu sử dụng màu Colorama, bạn nên gọi cho 328. Đặt 329 thành 330 có nghĩa là các chỉ thị màu sẽ tự động được đặt lại ở cuối chuỗi. Đó là một cài đặt hữu ích nếu bạn chỉ muốn tô màu một dòng tại một thời điểmIf you’d rather have all your output be (for example) blue, then you can let 329 be 332 and add 333 to the beginning of your script. Các màu sau đây có sẵn>>> 04You can also use 334 to control the style of your text. Bạn có thể chọn giữa 335, 336 và 337Cuối cùng, 338 cung cấp 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ừ 339 05Note how the counter stays in place instead of printing on separate lines as it normally would Hãy quay lại với nhiệm vụ hiện tại. Đố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 rất thú vị nhưng không quan trọng. Để tránh thêm một phần phụ thuộc khác vào ứng dụng của mình, bạn chỉ muốn sử dụng Colorama nếu ứng dụng này có sẵn trên hệ thống và không làm hỏng ứng dụng nếu ứng dụng không có Để 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 mô phỏng. Một mô hình có thể thay thế cho một đối tượng khác đồng thời cho phép bạn kiểm soát hành vi của nó. Đây là một nỗ lực ngây thơ để chế giễu Colorama >>> 06Điều này không thực sự hiệu quả, vì 340 được biểu thị bằng một chuỗi làm rối đầ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 rỗngCó thể thay đổi giá trị trả về của 177 trên đối tượng 342. However, in this case, it’s more convenient to write your own mock 07 343 là một chuỗi rỗng cũng sẽ trả về chuỗi rỗng khi nó được gọi. Điều này giúp chúng tôi triển khai lại Colorama một cách hiệu quả, chỉ cần không có màu sắcThủ thuật cuối cùng là 344 tự trả về, do đó tất cả màu sắc, kiểu dáng và chuyển động con trỏ là thuộc tính trên 345, 346, 347 và 348 cũng bị giả lậpMô-đun 349 được thiết kế để thay thế thả xuống cho Colorama, vì vậy bạn có thể cập nhật ví dụ đếm ngược bằng tìm kiếm và thay thế 08If you run this script on a system in which Colorama isn’t available, then it’ll still work, but it may not look as nice With Colorama installed, you should see the same results as earlier Import Scripts as ModulesOne difference between scripts and library modules is that scripts typically do something, whereas libraries provide functionality. Cả tập lệnh và thư viện đều nằm trong các tệp Python thông thường và đối với Python, không có sự khác biệt nào giữa chúng Thay vào đó, sự khác biệt là ở chỗ tệp được sử dụng như thế nào. should it be executed with 350 or imported with 351 inside another script?Sometimes you’ll have a module that works as both a script and a library. Bạn có thể thử cấu trúc lại 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 196. 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ể chỉnh sửa các tệp JSON. Giả sử bạn có tệp 353 sau 09Vì JSON thường chỉ được đọc bởi máy móc nên nhiều tệp JSON không được định dạng theo kiểu có thể đọc được. In fact, it’s quite common for JSON files to consist of one very long line of text 354 is a script that uses the 196 library to format JSON in a more readable fashion 10Bây giờ cấu trúc của tệp JSON trở nên dễ nắm bắt hơn nhiều. Bạn có thể sử dụng tùy chọn 356 để sắp xếp các khóa theo thứ tự bảng chữ cáiMặc dù việc chia nhỏ tập lệnh và thư viện là một phương pháp hay, nhưng Python có một thành ngữ giúp có thể coi một mô-đun vừa là tập lệnh vừa là thư viện cùng một lúc. Như đã lưu ý trước đó, giá trị của biến mô-đun 125 đặc biệt được đặt trong 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ệnhHãy thử nghiệm nó. Tạo tập tin sau 11Nếu bạn chạy tệp này, thì bạn sẽ thấy rằng 125 được đặt thành giá trị đặc biệt 126 12Tuy nhiên, nếu bạn nhập mô-đun, thì 125 được đặt thành tên của mô-đun>>> 13Hành vi này được tận dụng trong mẫu sau 14Hãy sử dụng điều này trong một ví dụ lớn hơn. Với nỗ lực giúp bạn luôn trẻ trung, tập lệnh sau sẽ thay thế bất kỳ độ tuổi “già” nào ( 361 trở lên) bằng 129 15Bạn có thể chạy tập lệnh này dưới dạng tập lệnh và nó sẽ tương tác làm cho độ tuổi bạn nhập trẻ hơn 16Bạn cũng có thể sử dụng mô-đun làm thư viện có thể nhập. Bài kiểm tra 124 ở 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 chức năng 364 và 365 được xác định. Ví dụ, bạn có thể sử dụng thư viện này như sau>>> 17Nếu không có sự bảo vệ của thử nghiệm 124, quá trình nhập sẽ kích hoạt 367 tương tác và khiến cho việc sử dụng 368 làm thư viện trở nên rất khó khănChạy tập lệnh Python từ tệp ZIPMột tính năng hơi khó hiểu của Python là nó có thể chạy các tập lệnh được đóng gói thành các tệp ZIP. Ưu điểm chính của điều này là bạn có thể phân phối một gói đầy đủ dưới dạng một tệp Tuy nhiên, lưu ý rằng điều này vẫn yêu cầu cài đặt Python 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, hãy xem Sử dụng PyInstaller để dễ dàng phân phối ứng dụng Python If you give the Python interpreter a ZIP file, then it’ll look for a file named 455 inside the ZIP archive, extract it, and run it. As a basic example, create the following 455 file 18Điều này sẽ in một tin nhắn khi bạn chạy nó 19Now add it to a ZIP archive. Bạn có thể làm điều này trên dòng lệnh 20Trên Windows, thay vào đó, bạn có thể sử dụng trỏ và nhấp. Chọn tệp trong File Explorer, sau đó nhấp chuột phải và chọn Gửi đến → thư mục đã nén (zipped) Vì 126 không phải là một cái tên mang tính mô tả nhiều nên bạn đã đặt tên cho tệp ZIP là 372. Bây giờ bạn có thể gọi nó trực tiếp bằng Python 21Note that your script is aware that it lives inside 372. 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 của Python để tập lệnh của bạn có thể nhập các mô-đun khác trong cùng một tệp ZIPNghĩ lại ví dụ trước đó mà bạn đã tạo một bài kiểm tra dựa trên dữ liệu dân số. Có thể phân phối toàn bộ ứng dụng này dưới dạng một tệp ZIP. 417 sẽ đảm bảo tệp dữ liệu được trích xuất từ kho lưu trữ ZIP khi cầnThe app consists of the following files 22Bạn có thể thêm chúng vào tệp ZIP giống như cách bạn đã làm ở trên. However, Python comes with a tool called 375 that streamlines the process of packing applications into ZIP archives. Bạn sử dụng nó như sau 23Lệnh này về cơ bản thực hiện hai việc. nó tạo ra một điểm vào và đóng gói ứng dụng của bạn Hãy nhớ rằng bạn cần tệp 455 làm điểm vào bên trong kho lưu trữ ZIP của mình. Nếu bạn cung cấp cho tùy chọn 458 thông tin về cách bắt đầu ứng dụng của bạn, thì 375 sẽ tạo tệp này cho bạn. Trong ví dụ này, 455 được tạo trông như thế này 24 455 này được đóng gói, cùng với nội dung của thư mục 381, vào một kho lưu trữ ZIP có tên là 382. Hậu tố 383 báo hiệu rằng đây là tệp Python được gói trong kho lưu trữ ZIPGhi chú. Theo mặc định, 375 không nén bất kỳ tệp nào. Nó chỉ đóng gói chúng thành một tệp duy nhất. Bạn cũng có thể yêu cầu 375 nén các tệp bằng cách thêm tùy chọn 386Tuy nhiên, tính năng này chỉ khả dụng trong Python 3. 7 trở lên. Xem tài liệu 375 để biết thêm thông tinTrên Windows, các tệp 383 đã được đăng ký dưới dạng tệp Python. On Mac and Linux, you can have 375 create executable files by using the 390 interpreter option and specifying which interpreter to use 25Tùy chọn 390 thêm một shebang ( 392) cho hệ điều hành biết cách chạy tệp. Additionally, it makes the 383 file executable so that you can run the file just by typing its name 26Lưu ý 394 trước tên tệp. This is a typical trick on Mac and Linux to run executable files in the current directory. Nếu bạn di chuyển tệp vào một thư mục trên 395 của mình hoặc nếu bạn đang sử dụng Windows thì bạn chỉ có thể sử dụng tên tệp. 382Ghi chú. Trên Python 3. 6 trở lên, lệnh trước đó sẽ thất bại với thông báo nói rằng nó không thể tìm thấy tài nguyên dữ liệu dân số trong thư mục 437. Điều này là do một giới hạn trong 398Một cách giải quyết khác là cung cấp đường dẫn tuyệt đối tới 382. Trên Mac và Linux, bạn có thể làm điều này bằng thủ thuật sau 27Lệnh 300 mở rộng đến đường dẫn của thư mục hiện tạiHãy kết thúc phần này bằng cách xem xét một hiệu ứng tuyệt vời khi sử dụng 417. Hãy nhớ rằng bạn đã sử dụng đoạn mã sau để mở tệp dữ liệu 28Một cách phổ biến hơn để mở tệp dữ liệu là xác định vị trí của chúng dựa trên thuộc tính 413 của mô-đun của bạn 29Cách tiếp cận này thường hoạt động tốt. However, it falls apart when your application is packed into a ZIP file 30Tệp dữ liệu của bạn nằm trong kho lưu trữ ZIP nên 430 không thể mở tệp đó. Mặt khác, 417 sẽ trích xuất dữ liệu của bạn thành một tệp tạm thời trước khi mở tệp đóXử lý nhập khẩu theo chu kỳNhập theo chu kỳ xảy ra khi bạn có hai hoặc nhiều mô-đun nhập lẫn nhau. Cụ thể hơn, hãy tưởng tượng rằng mô-đun 305 sử dụng 306 và mô-đun 307 nhập khẩu tương tự 305Hệ thống nhập của Python ở một mức độ nào đó được thiết kế để xử lý các chu kỳ nhập. Chẳng hạn, đoạn mã sau—mặc dù không hữu dụng lắm—chạy tốt 31Cố gắng nhập 305 trong trình thông dịch tương tác cũng nhập 307>>> 32Lưu ý rằng 307 được nhập vào giữa quá trình nhập của 305, chính xác tại câu lệnh 306 trong mã nguồn của 305. 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 bộ đệm mô-đunKhi bạn nhập 315, một tham chiếu đến 305 sẽ được thêm vào bộ nhớ cache của mô-đun ngay cả trước khi tải 305. Khi 307 cố gắng nhập 305 sau đó, nó chỉ cần sử dụng tham chiếu trong bộ đệm mô-đunBạn cũng có thể có các mô-đun làm điều gì đó hữu ích hơn một chút. Nếu bạn xác định các thuộc tính và chức năng trong các mô-đun của mình, thì tất cả vẫn hoạt động 33Nhập 305 hoạt động giống như trước đây>>> 32Các sự cố liên quan đến nhập đệ 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 hàm sẽ sử dụng mô-đun khác sau này. Thêm một dòng vào 321 35Bây giờ Python bị nhầm lẫn khi nhập >>> 36Thông báo lỗi lúc đầu có vẻ hơi khó hiểu. Nhìn lại mã nguồn, bạn có thể xác nhận rằng 130 được định nghĩa trong mô-đun 305Vấn đề là 130 không được xác định trong 305 tại thời điểm 307 được nhập. Do đó, 327 được sử dụng bởi lệnh gọi tới 328Để thêm vào sự nhầm lẫn, bạn sẽ không gặp vấn đề gì khi nhập 307>>> 37Vào thời điểm 307 gọi 328, 305 được nhập đầy đủ và 327 được xác định rõ. Cuối cùng, do bộ đệm mô-đun mà bạn đã thấy trước đó, 315 có thể hoạt động nếu bạn thực hiện một số thao tác nhập khác trước>>> 38Vậy làm thế nào bạn có thể tránh bị sa lầy và bối rối bởi việc nhập khẩu theo chu kỳ? Often, the easiest time to fix cyclical imports is before you implement them. Nếu bạn thấy các chu kỳ trong 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, đôi khi việc giới thiệu một chu kỳ nhập khẩu là hợp lý. 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ỉ định nghĩa các thuộc tính, hàm, lớp, v.v. Mẹo thứ hai—cũng là một phương pháp thiết kế tốt—là giữ cho các mô-đun của bạn không có tác dụng phụ khi nhập Nếu bạn thực sự cần các mô-đun có chu kỳ nhập và tác dụng phụ, thì vẫn còn một cách khác. thực hiện nhập cục bộ của bạn bên trong các chức năng Lưu ý rằng trong đoạn mã sau, 306 được thực hiện bên trong 328. Điều này có hai hậu quả. Đầu tiên, 307 chỉ khả dụng bên trong hàm 328. Quan trọng hơn, quá trình nhập không xảy ra cho đến khi bạn gọi 328 sau khi 305 đã được nhập đầy đủ 39Bây giờ không có vấn đề gì khi nhập và sử dụng 305>>> 40Lưu ý rằng trên thực tế, 307 không được nhập cho đến khi bạn gọi 328. Để có một góc nhìn khác về nhập khẩu theo chu kỳ, hãy xem ghi chú kinh điển của Fredrik LundhNhập hồ sơ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 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 Since the release of Python 3. 7, bạn đã có một cách nhanh chóng để biết cần bao nhiêu thời gian để nhập các gói và mô-đun. Trăn 3. 7 hỗ trợ tùy chọn dòng lệnh 344, đo lường và in lượng thời gian mỗi mô-đun cần để nhập 41Cột 345 hiển thị thời gian nhập tích lũy (tính bằng micrô giây) trên cơ sở từng gói. Bạn có thể đọc danh sách như sau. Python đã dành 346 micro giây để nhập đầy đủ 347, bao gồm cả việc nhập 138, 49 và triển khai C 350Cột 351 hiển thị thời gian cần thiết để chỉ nhập mô-đun đã cho, không bao gồm mọi lần nhập đệ quy. Bạn có thể thấy rằng 138 mất 353 micro giây để nhập, 49 mất 355, 350 mất 357 và bản thân việc nhập 347 mất 359 micro giây. Nói chung, điều này làm tăng thêm thời gian tích lũy là 346 micro giây (trong phạm vi lỗi làm tròn)Hãy xem ví dụ về 361 từ phần Colorama 42Trong ví dụ này, việc nhập 349 mất gần 0. 013 giây. Hầu hết thời gian đó được dành để nhập Colorama và các phụ thuộc của nó. Cột 351 hiển thị thời gian nhập không bao gồm nhập lồng nhauĐối với một ví dụ cực đoan, hãy xem xét đơn lẻ 124 từ trước đó. Vì nó đang tải một tệp dữ liệu lớn nên nhập cực kỳ chậm. Để kiểm tra điều này, bạn có thể chạy 365 dưới dạng tập lệnh với tùy chọn 386 43Trong trường hợp này, mất gần 2 giây để nhập 124, trong đó khoảng 1. 6 giây được sử dụng trong chính mô-đun, chủ yếu để tải tệp dữ liệu 344 là một công cụ tuyệt vời để tối ưu hóa quá trình nhập của bạn. Nếu bạn cần thực hiện giám sát và tối ưu hóa tổng quát hơn cho mã của mình, hãy xem Hàm hẹn giờ Python. Ba cách để theo dõi mã của bạnConclusionTrong hướng dẫn này, bạn đã biết hệ thống nhập Python. Giống như nhiều thứ trong Python, nó khá đơn giản để sử dụng cho các tác vụ cơ bản như nhập mô-đun và gói. Đồng thời, hệ thống nhập khẩu khá phức tạp, linh hoạt và có thể mở rộng. Bạn đã học được một số thủ thuật liên quan đến nhập mà bạn có thể tận dụng trong mã của riêng mình Trong hướng dẫn này, bạn đã học cách
Trong suốt hướng dẫn, bạn đã thấy nhiều liên kết đến thông tin thêm. Nguồn có thẩm quyền nhất trên hệ thống nhập Python là tài liệu chính thức
Bạn có thể sử dụng kiến thức về nhập Python của mình bằng cách làm theo các ví dụ trong hướng dẫn này. Nhấp vào liên kết bên dưới để truy cập vào mã nguồn Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này Đánh dấu là đã hoàn thành 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Geir Arne Hjelle Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python » Thông tin thêm về Geir ArneMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Brad Đan Joanna Gia-cốp Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Làm cách nào để nhập tất cả các hàm từ một tệp khác trong Python?Cách tiếp cận. Tạo tệp Python chứa các chức năng cần thiết. Tạo một tệp Python khác và nhập tệp Python trước đó vào đó. Gọi các hàm được xác định trong tệp đã nhập .
Làm cách nào bạn có thể nhập tất cả các chức năng từ tệp Python trong thư mục trước đó?Để nhập một mô-đun, thư mục chứa mô-đun đó phải có trên PYTHONPATH . Nó là một biến môi trường chứa danh sách các gói sẽ được Python tải. Danh sách các gói có trong PYTHONPATH cũng có trong sys. đường dẫn, vì vậy sẽ thêm đường dẫn thư mục mẹ vào sys.
Các chức năng có thể được nhập bằng Python không?Bạn có thể xác định các chức năng được sử dụng nhiều nhất trong một mô-đun và nhập nó , thay vì sao chép các định nghĩa của chúng vào các chương trình khác nhau. Một mô-đun có thể được nhập bởi một chương trình khác để sử dụng chức năng của nó. Đây là cách bạn cũng có thể sử dụng thư viện chuẩn Python.
Làm cách nào để nhập tất cả từ mô-đun Python?Bạn có thể nhập tất cả mã từ một mô-đun bằng cách chỉ định từ khóa nhập theo sau là mô-đun bạn muốn nhập . câu lệnh nhập xuất hiện ở đầu tệp Python, bên dưới bất kỳ nhận xét nào có thể tồn tại. Điều này là do việc nhập các mô-đun hoặc gói ở đầu tệp giúp cấu trúc mã của bạn rõ ràng hơn. |