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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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ì.
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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,

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

  • Sử dụng các mô -đun, gói và gói không gian tênmodules, packages, and namespace packages
  • Xử lý tài nguyên và tệp dữ liệu bên trong các gói của bạnresources and data files inside your packages
  • Nhập các mô -đun động trong thời gian chạydynamically at runtime
  • Tùy chỉnh hệ thống nhập Python Python’s import system

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', ...] 34

Mã 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ô -đun

Thuật ngữ python.org định nghĩa mô -đun như sau:module as follows:

Một đối tượng phục vụ như một đơn vị tổ chức của mã Python. Các mô -đun có một không gian tên chứa các đối tượng Python tùy ý. Các mô -đun được tải vào Python bởi quá trình nhập khẩu. (Nguồn)

Trong thực tế, một mô -đun thường tương ứng với một tệp

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>>

>>> import math
>>> math.pi
3.141592653589793

Trong dòng đầu tiên,

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38, bạn nhập mã trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39.
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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: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:

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)

Bạn có thể liệt kê nội dung của không gian tên với

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
46:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]

Trong dòng đầu tiên,

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38, bạn nhập mã trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39.
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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)

>>>

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined

Trong dòng đầu tiên,

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38, bạn nhập mã trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39.
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>>

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793

Trong dòng đầu tiên,

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38, bạn nhập mã trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 và làm cho nó có sẵn để sử dụng. Trong dòng thứ hai, bạn truy cập biến
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 trong mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39.
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

Bạn có thể liệt kê nội dung của không gian tên với

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
46:

Sử dụng

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39, bạn sử dụng
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
49.

Bạn đã thấy việc sử dụng

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 từ mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py

Lưu ý rằng điều này đặt

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40 trong không gian tên toàn cầu và không nằm trong không gian tên
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39.

# 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

Lưu ý rằng

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
61 chỉ nhập
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
62 chứ không phải
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
63. Tương tự,
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
64 không nhập bất cứ thứ gì, trong khi
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
65 nhập
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
66 và
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
67 nhưng không phải
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'

Khi

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
63 được nhập, các mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
71 và
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

Khi

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
63 được nhập, các mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
71 và
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

Khi

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
63 được nhập, các mô -đun
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
71 và
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
64 trống. Điều này có nghĩa là nhập gói
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
76 phổ biến.

Nhập khẩu tuyệt đối và tương đối

Nhớ lại mã nguồn của

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
61 trong ví dụ trước:relative import. You can read it as “From the current package, import the subpackage
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
62.”

Bạn đã thấy các câu

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
78 như
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
79, nhưng dấu chấm (
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
80) trong
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

  1. Làm thế nào để Python tìm thấy các mô -đun và gói mà nó nhập? Bạn sẽ thấy thêm chi tiết về cơ chế của hệ thống nhập Python sau này. Hiện tại, chỉ cần biết rằng Python tìm kiếm các mô -đun và gói trong đường dẫn nhập của nó. Đây là danh sách các vị trí được tìm kiếm cho các mô -đun để nhập.
  2. Bạn có thể kiểm tra đường dẫn nhập Python bằng cách in
    >>> import math
    >>> dir()
    ['__annotations__', '__builtins__', ..., 'math']
    
    >>> dir(math)
    ['__doc__', ..., 'nan', 'pi', 'pow', ...]
    
    85. Nói rộng ra, danh sách này sẽ chứa ba loại vị trí khác nhau:
  3. Thư mục của tập lệnh hiện tại (hoặc thư mục hiện tại nếu không có tập lệnh nào, chẳng hạn như khi Python chạy tương tác)

Nội dung của biến môi trường

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 module:

# math.py

def double(number):
    return 2 * number

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ừ đó.

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
0

Tuy 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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 sau:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
1

Sử 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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
2

Ví dụ: Cấu trúc nhập khẩu của bạn

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
3

Hai tệp mã nguồn cũng như tệp

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
98 được tạo tự động được tạo lại bên trong một thư mục mới có tên
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
95:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
4

Trong 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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,

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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,
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
02, that will be the root of your new file hierarchy. Then you loop through all paths below the original
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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,

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
06. Bạn sẽ tìm hiểu thêm về bài kiểm tra
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
07 trên dòng 25 sau. Hiện tại, bạn nên biết rằng biến đặc biệt
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
08 có giá trị
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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ề
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
06. You’ll learn more about the
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
07 test on line 25 later. For now, you should know that the special variable
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
08 has the value
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
09 inside scripts, but it gets the name of the module inside imported modules. For more information on
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
5

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
02 của phân cấp tệp được tạo lại. Tiếp theo,
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
15.

Hãy xem lại việc nhập

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
11 một lần nữa:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
6

Nó 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
11 từ dự án
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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à
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
7

Trong thư mục bên ngoài, tạo tập lệnh điểm nhập,

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
22:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
8

Tập lệnh này sẽ nhập

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
06 từ tập lệnh gốc của bạn và chạy nó. Lưu ý rằng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
06 là chạy khi
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
97 được nhập khẩu do thử nghiệm
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
07 trên dòng 25 trong
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
95. Điều đó có nghĩa là bạn cần chạy
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
06 một cách rõ ràng.line 25 in
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
95. That means you need to run
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
9

Tại sao không làm việc đó? Đột nhiên, việc nhập

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
11 gây ra lỗi.

Vấn đề là bằng cách bắt đầu ứng dụng với

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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.
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
0

Điều này hoạt động vì đường dẫn nhập bao gồm thư mục chứa

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
95 và
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

Trong Python 2.4 và trước đó, nếu bạn đang đọc một mô-đun nằm trong một gói, không rõ liệu

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
34 có đề cập đến một mô-đun cấp cao nhất hay cho một mô-đun khác bên trong gói. Khi thư viện Python, mở rộng, ngày càng có nhiều mô -đun nội bộ hiện có đột nhiên các mô -đun thư viện tiêu chuẩn bóng tối một cách tình cờ. Đây là một vấn đề đặc biệt khó khăn bên trong các gói bởi vì không có cách nào để chỉ định mô -đun nào có nghĩa là. (Nguồn)

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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
95 như sau:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
1

Bâ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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
2

Thật không may, bạn không còn có thể gọi ứng dụng trực tiếp:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
3

Vấ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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
85 trong hầu hết các trường hợp. Để trích dẫn Raymond Hettinger:

Phải có cách tốt hơn! (Nguồn)

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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
39 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
40 tối thiểu trong thư mục
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
97 bên ngoài:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
4

Về lý thuyết,

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
42 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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ư

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
45 hoặc tên người dùng của bạn.
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
38:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
5

Lệnh này sẽ cài đặt gói vào hệ thống của bạn.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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ờ

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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ên

Cá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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
37 nhưng không
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
56. Xem PEP 420 để biết giải thích chi tiết.
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
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
37 file but no
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
53.serialize
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
53 objects.

Để cụ thể hơn, bạn muốn triển khai mã hoạt động như thế này:

>>>

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
7

Hã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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
8

Tệp

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
55 chứa mã có thể tuần tự hóa một đối tượng vào định dạng JSON:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
9

Giao 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
56 chứa một
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
57 tương tự có thể chuyển đổi một đối tượng thành XML:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
0

Lư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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
58,
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
59 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
60.

Sau đó, bạn tạo một lớp

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
53 có thể sử dụng các serializer sau:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
1

Một

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
53 được xác định bởi ID, tiêu đề và nghệ sĩ của nó. Lưu ý rằng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
64 của bên thứ ba, bạn có thể sử dụng nó như sau:

>>>

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
2

Bằng cách cung cấp các đối tượng serializer khác nhau cho

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
66 của riêng mình vào gói
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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à

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
3

Trong tệp

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
69, bạn xác định
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
66 của riêng bạn. Bạn dựa trên gói
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
71, phải được cài đặt từ PYPI:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
4

Vì 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
72:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
5

Lưu ý rằng

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
66 dựa trên
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
72, được nhập từ chính
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
64. Vì cả
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
76 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>>

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
6

Giố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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
64. Trong mã thực tế, bạn đã 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ủ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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82 là một gói thực sự, thì bạn sẽ tải xuống từ PYPI bằng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
38. Vì điều này là có thể, bạn có thể mô phỏng nó bằng cách cài đặt
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82 cục bộ như bạn đã làm trong ví dụ
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>>

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
7

Giố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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
64. Trong mã thực tế, bạn đã 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ủ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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82 là một gói thực sự, thì bạn sẽ tải xuống từ PYPI bằng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
38. Vì điều này là có thể, bạn có thể mô phỏng nó bằng cách cài đặt
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82 cục bộ như bạn đã làm trong ví dụ
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    82 và
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    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:
  • Bây giờ bạn có thể sử dụng tất cả các serializer mà không phải lo lắng về việc liệu họ có được xác định trong gói của bên thứ ba hay tại địa phương hay không.
  • Hướng dẫn phong cách nhập khẩu
  • PEP 8, Hướng dẫn theo phong cách Python, có một vài khuyến nghị về nhập khẩu. Như mọi khi với Python, việc giữ mã của bạn vừa có thể đọc được và có thể bảo trì là một sự cân nhắc quan trọng. Dưới đây là một vài quy tắc chung về cách tạo kiểu nhập khẩu của bạn:
  • Giữ nhập khẩu ở đầu tệp.
  • Viết nhập khẩu trên các dòng riêng biệt.

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.

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
8

Thí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ư

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
91 và
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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.

  1. Có những trường hợp có ý nghĩa để uốn cong các quy tắc này một chút. Bạn đã thấy rằng nhập khẩu tương đối có thể là một giải pháp thay thế cho việc tổ chức các phân cấp gói. Sau đó, bạn sẽ thấy làm thế nào trong một số trường hợp bạn có thể chuyển nhập vào một định nghĩa chức năng để phá vỡ các chu kỳ nhập.

  2. Nhập khẩu tài nguyên

Đã có một số nỗ lực giải quyết những thách thức này, bao gồm

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
96. Tuy nhiên, với việc giới thiệu
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

Nếu bạn có thể nhập gói, bạn có thể truy cập tài nguyên trong gói đó. (Nguồn)

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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à
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
01. Để sử dụng backport, cài đặt nó từ PYPI:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
9

Backport 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
0

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
56 chỉ là một tệp trống cần thiết để chỉ định
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
05 dưới dạng gói thông thường.

Sau đó, bạn có thể sử dụng

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
06 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
07 để mở các tệp văn bản và nhị phân, tương ứng:

>>>

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
1

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
06 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
07 tương đương với
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
10 tích hợp với tham số
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
11 được đặt thành
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
12 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
14 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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ệu

Như 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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
16 và tải xuống
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
17 từ trang web của Liên Hợp Quốc:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
2

Mở tệp CSV và xem dữ liệu:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
3

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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
18 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
19:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
4

Các dòng được tô sáng cho thấy cách

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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ố:

>>>

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
5

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
06 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
07 tương đương với
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
10 tích hợp với tham số
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
11 được đặt thành
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
12 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
14 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
15. Xem tài liệu chính thức để biết thêm thông tin.

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
6

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ệu

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
7

Như 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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
16 và tải xuống
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
17 từ trang web của Liên Hợp Quốc:line 24, you also check that the
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
21 is less than
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
22. Locations with a
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
21 of
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
22 and above are not proper countries, but aggregates like
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
25,
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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.

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
18 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
19:

Các dòng được tô sáng cho thấy cách

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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.

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97 giải quyết điều này bằng cách cung cấp
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
31 làm trình quản lý ngữ cảnh bằng cách sử dụng từ khóa
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
33:

>>>

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
8

Ví dụ đầy đủ, giả sử bạn có hệ thống phân cấp tệp sau:

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
9

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:

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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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à

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
38. Lưu ý rằng bạn sử dụng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97 để có được đường dẫn của các tệp hình ảnh:

# 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
0

Nế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 độ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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40 để nó không làm gì cả:

>>>

# 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
1

Ví 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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
37, hãy xem cách xuất bản gói Python nguồn mở thành PYPI.

# 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
2

GUI được định nghĩa trong một lớp gọi là

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
38. Lưu ý rằng bạn sử dụng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97 để có được đường dẫn của các tệp hình ảnh:

# 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
3

Nế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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40 để nó không làm gì cả:

# 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
4

Về mặt kỹ thuật, bạn không xác định lại

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40. Thay vào đó, bạn đã xác định một
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40 khác trong việc tích hợp. Để quay trở lại bằng cách sử dụng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40 gốc, bạn có thể xóa tùy chỉnh của mình bằng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
45

>>>

# 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
5

Cho đến nay, bạn đã sử dụng từ khóa Python từ

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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ó:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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 độ:

  1. Gói plugin là một tập hợp các plugin liên quan tương ứng với gói Python. is a collection of related plugins corresponding to a Python package.
  2. Một plugin là một hành vi tùy chỉnh được cung cấp trong một mô -đun Python. is a custom behavior made available in a Python module.

Mô -đun

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
57 hiển thị kiến ​​trúc plugin có các chức năng sau:

# 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
6

Cá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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
58 được mô tả ở trên:

# 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
7

Việ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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
59 sử dụng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
60 để tải các plugin tự động. Ngoài ra,
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
61 sử dụng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
63 sau:

# 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
8

Mỗi mô -đun

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
63 xác định một hàm có một đối số
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
42. Lưu ý cách họ đã đăng ký làm plugin bằng cách sử dụng trình trang trí
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
67:

# 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
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
57 để thêm chức năng vào chính gói
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
63:

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
0

Bây giờ bạn có thể sử dụng

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
71 và
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
72 như sau:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
1

Lưu ý rằng

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
2

Lưu ý rằng

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
71 tự động phát hiện ra tất cả các plugin có sẵn trong gói.

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
3

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:

  1. Để khám phá và gọi các plugin khác nhau, bạn cần nhập chúng. Hãy cùng có một cái nhìn nhanh về cách
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    57 xử lý nhập khẩu. Công việc chính được thực hiện trong hai chức năng sau đây
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    58:
  2. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    59 có vẻ đơn giản. Nó sử dụng
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    45 để nhập một mô -đun. Nhưng có một vài điều cũng xảy ra trong nền:
  3. Hệ thống nhập Python sườn đảm bảo rằng mỗi plugin chỉ được nhập một lần.

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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.

  1. Trong một triển khai đầy đủ, cũng sẽ có một số xử lý lỗi để xử lý các plugin bị thiếu.
  2. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    61 phát hiện ra tất cả các plugin trong một gói. Ở đây, cách thức hoạt động của nó:
  3. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    80 từ
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    97 liệt kê tất cả các tệp bên trong một gói.
  4. Các kết quả được lọc để tìm các plugin tiềm năng.

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ý.

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
4

Hã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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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.

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
77 serializer:

Tiếp theo, cập nhật

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
84 để sử dụng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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à:

  1. Tìm kiếm
  2. Nạp vào
  3. Ràng buộc với một không gian tên

Đố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ố

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
34, tất cả ba bước sẽ tự động xảy ra. Tuy nhiên, khi bạn sử dụng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
43 gần như tương đương:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
6

Tấ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:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
7

Tấ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:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
8

Trong 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ố:

>>>

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
9

Tất nhiên, trong mã thông thường, bạn nên thích cái trước.

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

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:

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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.

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

0

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.

Ví dụ: singletons là mô -đun

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

1

Tấ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:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

1

Tấ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:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

3

Tất nhiên, trong mã thông thường, bạn nên thích cái trước.

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

4

Lưu ý rằng

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
02 yêu cầu một đối tượng mô -đun, không phải là một chuỗi như
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
48. Ngoài ra, hãy lưu ý rằng
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ải

Bạ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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
05 trong đường dẫn nhập của Python, thì bạn đã giành chiến thắng có thể nhập
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
07 với nội dung sau:

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

5

Tiếp theo, mở một thông dịch viên Python và nhập mô -đun mới này:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

6

Một cái gì đó kỳ lạ đã xảy ra. Nó không giống như Python nhập mô -đun

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
08 mới của bạn. Thay vào đó, nó đã nhập mô -đun
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

7

Bạn có thể thấy rằng

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 được nhập từ một tệp, trong khi
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

  1. Python kiểm tra nếu mô -đun có sẵn trong bộ đệm mô -đun. Nếu

    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    91 chứa tên của mô -đun, thì mô -đun đã có sẵn và quá trình nhập kết thúc.module cache. If
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    91 contains the name of the module, then the module is already available, and the import process ends.

  2. Python bắt đầu tìm kiếm mô -đun bằng một số công cụ tìm. Một công cụ tìm kiếm sẽ tìm kiếm mô -đun bằng một chiến lược nhất định. Các công cụ tìm mặc định có thể nhập các mô-đun tích hợp, mô-đun đông lạnh và mô-đun trên đường dẫn nhập.finders. A finder will search for the module using a given strategy. The default finders can import built-in modules, frozen modules, and modules on the import path.

  3. Python tải mô -đun bằng trình tải. Trình tải mà Python sử dụng được xác định bởi công cụ tìm xác định mô -đun và được chỉ định trong một thứ gọi là thông số kỹ thuật mô -đun.loader. Which loader Python uses is determined by the finder that located the module and is specified in something called a module spec.

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.

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
13 Điều khiển mà người tìm được gọi trong quá trình nhập:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>>

>>> # Import europe explicitly
>>> from world import europe
Greek: Γειά σας Κόσμε
Norwegian: Hei verden

>>> # The greece submodule has been automatically imported
>>> europe.greece


>>> # Because world is imported, europe is also found in the world namespace
>>> world.europe.norway


>>> # The spain submodule has not been imported
>>> europe.spain
AttributeError: module 'world.europe' has no attribute 'spain'

>>> # Import spain explicitly inside the world namespace
>>> import world.europe.spain
Castellano: Hola mundo

>>> # Note that spain is also available directly inside the europe namespace
>>> europe.spain


>>> # Importing norway doesn't do the import again (no output), but adds
>>> # norway to the global namespace
>>> from world.europe import norway
>>> norway

9

Vì 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,

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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,
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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:

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

0

Tất cả các công cụ tìm phải thực hiện một phương thức lớp

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
17, nên cố gắng tìm một mô -đun nhất định. Có ba cách mà
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
17 có thể chấm dứt:

  1. Bằng cách trả về
    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    19 nếu nó không biết cách tìm và tải mô -đunreturning
    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    19
    if it doesn’t know how to find and load the module
  2. Bằng cách trả về một thông số mô -đun chỉ định cách tải mô -đunreturning a module spec specifying how to load the module
  3. Bằng cách tăng
    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    20 để chỉ ra rằng mô -đun có thể được nhậpraising a
    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    20
    to indicate that the module can’t be imported

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
21 in một thông báo vào bảng điều khiển và sau đó trả về rõ ràng
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

1

Ví dụ, bạn có thể thấy rằng việc nhập

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
24 kích hoạt việc nhập một số mô -đun khác mà
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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,
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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. .

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

2

Tăng

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

3

Mặc dù bạn chỉ nhập

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
24, mô -đun đó đang nhập
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ừ PYPI

Bở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à

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
38:

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

4

So 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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
17 chỉ là làm
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
37 mà không cần tự cài đặt:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

5

Thông thường,

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
38 sẽ tăng lên
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
20, nhưng trong trường hợp này
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
37 đã được cài đặt và nhập.

Trong khi

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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à
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
42 trên PYPI, nhưng tên nhập đơn giản là
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
43.

Sử dụng

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
34 để nhập và cài đặt
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
43 kết thúc việc cài đặt sai gói:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
38. Nhưng bạn cũng có thể kích hoạt cài đặt tự động:

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ệu

Ví 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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
49 nhỏ hơn sau:

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

7

Dò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:

>>>

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

8

Cô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:

>>> # Even though africa has been imported, zimbabwe has not
>>> world.africa.zimbabwe
AttributeError: module 'world.africa' has no attribute 'zimbabwe'

>>> # Import zimbabwe explicitly into the global namespace
>>> from world.africa import zimbabwe
Shona: Mhoroyi vhanu vese
Ndebele: Sabona mhlaba

>>> # The zimbabwe submodule is now available
>>> zimbabwe


>>> # Note that zimbabwe can also be reached through the africa subpackage
>>> world.africa.zimbabwe

9

Có 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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
17 và
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
51. Hãy cùng nhìn vào họ chi tiết hơn.

Như bạn đã thấy trước đó,

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ố
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
53.
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
42 chứa tên đầy đủ của mô -đun được nhập. Ví dụ: nếu bạn sử dụng
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
55, thì
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
42 sẽ là
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
57. Trong trường hợp này, tên tệp sẽ là
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
49.

Đối với nhập khẩu cấp cao nhất,

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
59 sẽ là
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ì
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
62.

Dữ liệu CSV được tải bởi

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
51. Bạn có thể sử dụng
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>>

# math.py

def double(number):
    return 2 * number
0

Nó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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
69 với không gian thay vì dấu gạch dưới.

Bằng cách kết nối

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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:

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
73:

# math.py

def double(number):
    return 2 * number
1

Trong phần còn lại của mã, bạn có thể tham khảo

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
74 và không lo lắng về việc bạn sử dụng
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97 hay
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
01.

Thông thường, nó dễ dàng nhất để sử dụng câu lệnh

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

# math.py

def double(number):
    return 2 * number
2

Điều này sẽ sử dụng

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97 trên Python 3.7 trở lên trong khi rơi trở lại
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
01 trên các phiên bản Python cũ hơn. Xem dự án
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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à

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
81, đây là phiên bản tối ưu của
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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 đó:

# math.py

def double(number):
    return 2 * number
3

Điều này sẽ sử dụng

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
81 nếu nó có sẵn và quay trở lại
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
76 trong thư viện tiêu chuẩn:

# math.py

def double(number):
    return 2 * number
4

Bằng cách đổi tên

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
86 thành
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>>

# math.py

def double(number):
    return 2 * number
5

Thậ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:

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

Trước khi bạn bắt đầu sử dụng Colorama Colors, bạn nên gọi

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
89. Cài đặt
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
90 thành
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ể để

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
90 là
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
93 và thêm
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
94 vào đầu tập lệnh của bạn. Các màu sau có sẵn:

>>>

# math.py

def double(number):
    return 2 * number
6

Bạn cũng có thể sử dụng

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
95 để kiểm soát kiểu văn bản của bạn. Bạn có thể chọn giữa
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
96,
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
97 và
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
98.

Cuối cùng,

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
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ừ
# 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
00:

# math.py

def double(number):
    return 2 * number
7

Lư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ướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

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:

>>>

# math.py

def double(number):
    return 2 * number
8

Điều này không hoạt động khá, bởi vì

# 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
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:

# math.py

def double(number):
    return 2 * number
9

# 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
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à

# 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
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
# 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
06,
# 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
07,
# 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
08 và
# 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
09 cũng bị chế giễu.

Mô-đun

# 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
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ế:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
00

Nế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:

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

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ô -đun

Mộ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

# 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
11 hoặc được nhập với
# 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
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
# 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
14 sau:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
01

Vì 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.

# 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
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
02

Bâ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

# 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
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
03

Nếu bạn chạy tệp này, thì bạn sẽ thấy

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
08 được đặt thành giá trị đặc biệt
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
09:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
04

Tuy nhiên, nếu bạn nhập mô -đun, thì

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
05

Hã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 (

# 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
22 trở lên) bằng
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
99:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
06

Bạ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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
07

Bạn cũng có thể sử dụng mô -đun như một thư viện có thể nhập. Thử nghiệm

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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
# 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
25 và
# 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
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
# 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
25 and
# 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
26 are defined. You can, for instance, use this library as follows:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
08

Điều này không hoạt động khá, bởi vì

# 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
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:

# 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
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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
34 sau:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
09

Điều này sẽ in một tin nhắn khi bạn chạy nó:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
10

Bâ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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
11

Trê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).

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
09 là một tên rất mô tả, bạn đã đặt tên cho tệp zip
# 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
33. Bây giờ bạn có thể gọi nó trực tiếp với Python:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
12

Lưu ý rằng kịch bản của bạn nhận thức được rằng nó sống bên trong

# 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
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.

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
13

Bạ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à

# 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
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
14

Lệ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

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
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
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
37 thông tin về cách bắt đầu ứng dụng của bạn, thì
# 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
36 sẽ tạo tệp này cho bạn. Trong ví dụ này,
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
34 được tạo trông như thế này:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
15

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
34 này được đóng gói, cùng với nội dung của thư mục
# 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
42, vào một kho lưu trữ zip có tên
# 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
43. Hậu tố
# 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
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

# 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
44 đã được đăng ký dưới dạng các tệp Python. Trên Mac và Linux, bạn có thể có
# 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
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
# 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
47 và chỉ định trình thông dịch nào sẽ sử dụng:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
16

Tùy chọn

# 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
47 thêm một shebang (
# 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
49) cho hệ điều hành cách chạy tệp. Ngoài ra, nó làm cho tệp
# 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
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 (
# 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
49) that tells the operating system how to run the file. Additionally, it makes the
# 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
44 file executable so that you can run the file just by typing its name:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
17

Lưu ý

# 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
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
# 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
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:
# 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
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

>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
97. Hãy nhớ rằng bạn đã sử dụng mã sau để mở tệp dữ liệu:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
18

Mộ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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
19

Cá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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
20

Tệp dữ liệu của bạn nằm trong kho lưu trữ zip, vì vậy

>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
10 không thể mở nó.
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
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

# 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
58 sử dụ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
59 và mô -đun
# 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
60 nhập tương tự
# 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
58.

Hướng dẫn what is import in python with example? - import trong python với ví dụ là gì?

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.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
21

Cố gắng nhập

# 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
58 trong trình thông dịch tương tác nhập khẩu
# 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
60:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
22

Lưu ý rằ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
60 được nhập vào giữa việc nhập
# 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
58, chính xác là tại câu lệnh
# 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
59 trong mã nguồn của
# 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
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

# 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
68, một tham chiếu đến
# 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
58 được thêm vào bộ đệm mô -đun ngay cả trước khi
# 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
58 được tải. Khi
# 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
60 cố gắng nhập
# 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
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
23

Nhập

# 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
58 hoạt động giống như trước đây:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
22

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

# 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
74:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
25

Bây giờ Python bị nhầm lẫn bởi việc nhập khẩu:

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
26

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

# 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
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
00 được xác định trong mô -đun
# 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
58.

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
27

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

# 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
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
# 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
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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
00 được xác định trong mô -đun
# 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
58.try to break the cycles.

Vấn đề là

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
00 được xác định trong
# 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
58 tại thời điểm
# 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
60 được nhập. Do đó,
# 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
80 được sử dụng bởi cuộc gọi đến
# 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
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

# 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
60:do your imports locally inside functions.

Vào thời điểm

# 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
60 gọi
# 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
81,
# 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
58 được nhập hoàn toàn và
# 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
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 đó,
# 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
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:

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
29

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
28

>>>

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
30

Vậ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.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
31

Lưu ý rằng trong mã sau,

# 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
59 được thực hiện bên trong
# 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
81. Điều này có hai hậu quả. Đầu tiên,
# 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
60 chỉ có sẵn bên trong hàm
# 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
81. Quan trọng hơn, việc nhập không xảy ra cho đến khi bạn gọi
# 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
81 sau khi
# 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
58 đã được nhập hoàn toàn:

Bây giờ không có vấn đề nhập khẩu và sử dụ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
58:

Lưu ý rằng trên thực tế,

# 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
60 không được nhập cho đến khi bạn gọi
# 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
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.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
32

Hồ 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.

>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
33

Kể 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

# 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
97, đo lường và in bao nhiêu thời gian mỗi mô-đun để nhập:

Cột

# 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
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
# 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
99 micro giây để nhập hoàn toàn
>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
00, liên quan đến việc nhập
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
08,
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
39 và triển khai C
>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
03.

Cột >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 04 hiển thị thời gian chỉ cần nhập mô -đun đã cho, không bao gồm bất kỳ nhập khẩu nào. Bạn có thể thấy rằng world/ │ ├── africa/ │ ├── __init__.py │ └── zimbabwe.py │ ├── europe/ │ ├── __init__.py │ ├── greece.py │ ├── norway.py │ └── spain.py │ └── __init__.py 08 đã mất >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 06 micro giây để nhập, >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 39 đã lấy >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 08, >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 03 đã lấy >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 10 và nhập khẩu >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 00 đã tự mình lấy >>> import world >>> world >>> # The africa subpackage has been automatically imported >>> world.africa >>> # The europe subpackage has not been imported >>> world.europe AttributeError: module 'world' has no attribute 'europe' 12. Nói chung, điều này thêm vào thời gian tích lũy là # 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 99 micro giây (trong các lỗi làm tròn).

Hãy xem ví dụ

>>> import world
>>> world


>>> # The africa subpackage has been automatically imported
>>> world.africa


>>> # The europe subpackage has not been imported
>>> world.europe
AttributeError: module 'world' has no attribute 'europe'
14 từ phần Colorama:

Trong hướng dẫn này, bạn đã học được cách:

  • Tạo gói không gian tênnamespace packages
  • Nhập tài nguyên và tệp dữ liệuresources and data files
  • Quyết định những gì cần nhập động trong thời gian chạydynamically at runtime
  • Mở rộng hệ thống nhập khẩu Python Python’s import system
  • Xử lý các phiên bản khác nhau của các góiversions of packages

Trong suốt hướng dẫn, bạn đã thấy nhiều liên kết để biết thêm thông tin. 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:

  • Hệ thống nhập khẩu
  • Gói
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    45
  • PEP 420: Gói không gian tên ngầm
  • Nhập các mô -đun

Bạn có thể đặt kiến ​​thức về nhập khẩu Python để sử dụng bằng cách làm theo cùng với 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:

Nhập khẩu trong Python là gì?

Trong Python, bạn sử dụng từ khóa nhập để 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ì.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.

Làm thế nào để bạn nhập một ví dụ trong Python?

Làm thế nào để nhập các mô -đun trong Python ?..
# Nhập câu lệnh Ví dụ # Để nhập mô -đun tiêu chuẩn Math Nhập Math in ("Giá trị của Pi là", Math.Pi) ....
# Nhập mô -đun bằng cách đổi tên CNTT Nhập toán làm M in ("Giá trị của Pi là", M.PI) ....
# Chỉ nhập pi từ mô -đun toán học từ nhập khẩu pi in ("giá trị của pi là", pi).

Tuyên bố nhập khẩu trong Python với ví dụ là gì?

Câu lệnh nhập Python cho phép bạn nhập mô -đun vào mã của mình.Mô -đun là một tệp chứa các chức năng và giá trị mà bạn có thể tham chiếu từ chương trình của mình.Cú pháp báo cáo nhập là: Nhập mô đun.lets you import a module into your code. A module is a file that contains functions and values that you can reference from your program. The import statement syntax is: import modulename.

Các loại nhập khẩu trong Python là gì?

Nhìn chung có ba nhóm: Nhập khẩu thư viện tiêu chuẩn (Mô-đun tích hợp của Python) Nhập khẩu bên thứ ba liên quan (các mô-đun được cài đặt và không thuộc về ứng dụng hiện tại) Nhập ứng dụng cục bộ (các mô-đun thuộc về ứng dụng hiện tại)