Hướng dẫn python from file import - python từ nhập tệp



Các khóa học qua video:
Lập trình C Java C# SQL Server PHP HTML5-CSS3-JavaScript

Mục lục bài viết:

  • Nhập Python cơ bản
    • Mô-đun
    • Các gói
    • Nhập khẩu tuyệt đối và tương đối
    • Đường dẫn nhập của Python
    • Ví dụ: Cấu trúc nhập khẩu của bạn
    • Tạo và cài đặt gói cục bộ
    • Gói không gian tên
    • Hướng dẫn kiểu nhập khẩu
  • Nhập tài nguyên
    • Giới thiệu importlib.resources
    • Ví dụ: Sử dụng tệp dữ liệu
    • Ví dụ: Thêm biểu tượng vào Tkinter GUIs
  • Nhập động
    • Sử dụng importlib
    • Ví dụ: Phương pháp ban đầu với các gói không gian tên
    • Ví dụ: Một gói các plugin
  • Hệ thống nhập Python
    • Nhập nội bộ
    • Ví dụ: Singletons dưới dạng Mô-đun
    • Đang tải lại các mô-đun
    • Finders and Loaders
    • Ví dụ: Tự động cài đặt từ PyPI
    • Ví dụ: Nhập tệp dữ liệu
  • Mẹo và thủ thuật nhập khẩu
    • Xử lý các gói trên các phiên bản Python
    • Xử lý các gói bị thiếu: Sử dụng một gói thay thế
    • Xử lý các gói bị thiếu: Sử dụng Mock để thay thế
    • Nhập tập lệnh dưới dạng mô-đun
    • Chạy tập lệnh Python từ tệp ZIP
    • Xử lý nhập khẩu theo chu kỳ
    • Nhập hồ sơ
  • Phần kết luận

Show

Các bạn có thể download code ví dụ tại ĐÂY để tiện trong quá trình tìm hiểu bài viết này.

Trong Python, bạn sử dụng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
35từ khóa để làm cho mã trong một mô-đun này có sẵn trong một mô-đun khác. Nhập bằng Python rất quan trọng để cấu trúc mã của bạn một cách hiệu quả. Sử dụng nhập đúng cách sẽ làm cho bạn năng suất hơn, cho phép bạn sử dụng lại mã trong khi vẫn giữ được các dự án của bạn.

Hướng dẫn này sẽ cung cấp một cái nhìn tổng quan toàn diện về 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
35câu lệnh của Python và cách nó hoạt động. Hệ thống nhập rất mạnh và bạn sẽ học cách khai thác sức mạnh này. Trong khi bạn sẽ bao gồm nhiều khái niệm đằng sau hệ thống nhập của Python, hướng dẫn này chủ yếu là hướng dẫn ví dụ. Bạn sẽ học 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 mô-đun , gói và gói không gian tên
  • Xử lý tài nguyên và tệp dữ liệu bên trong gói của bạn
  • Nhập mô-đun động trong thời gian chạy
  • Tùy chỉnh hệ thống nhập của Python

Python cơ bản >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 35

Mã Python được tổ chức thành cả mô-đun và gói . Phần này sẽ giải thích chúng khác nhau như thế nào và bạn có thể làm việc với chúng như thế nào.

Ở phần sau của hướng dẫn, bạn sẽ thấy một số cách sử dụng nâng cao và ít được biết đến của hệ thống nhập của Python. Tuy nhiên, hãy bắt đầu với những điều cơ bản: nhập mô-đun và gói.

Mô-đun

Các Python.org thuật ngữ định nghĩa mô-đun như sau:

Một đối tượng phục vụ như một đơn vị tổ chức của mã Python. 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ằng quá trình nhập. ( Nguồn )

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38tệp 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. Hãy 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', ...]
39, bạn nhập mã trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41 biến trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40là một phần của thư viện chuẩn của Python , có nghĩa là nó luôn có sẵn để nhập khi bạn đang chạy Python.

Lưu ý rằng bạn viết 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
44và không chỉ đơn giản 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41. Ngoài việc là một mô-đun, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40hoạt động như một không gian tên giữ tất cả các thuộc tính của mô-đun lại với nhau. Không gian tên rất hữu ích để giữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters:

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 nữa! ( Nguồn )

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

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

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

>>>

>>> 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', ...]
39, bạn nhập mã trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41 biến trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40là một phần của thư viện chuẩn của Python , có nghĩa là nó luôn có sẵn để nhập khi bạn đang chạy Python.

Lưu ý rằng bạn viết 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
44và không chỉ đơn giản 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41. Ngoài việc là một mô-đun, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40hoạt động như một không gian tên giữ tất cả các thuộc tính của mô-đun lại với nhau. Không gian tên rất hữu ích để giữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters:

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 nữa! ( 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', ...]
39, bạn nhập mã trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41 biến trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40là một phần của thư viện chuẩn của Python , có nghĩa là nó luôn có sẵn để nhập khi bạn đang chạy Python.

Lưu ý rằng bạn viết 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
44và không chỉ đơn giản 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41. Ngoài việc là một mô-đun, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40hoạt động như một không gian tên giữ tất cả các thuộc tính của mô-đun lại với nhau. Không gian tên rất hữu ích để giữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters:

>>>

>>> 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', ...]
39, bạn nhập mã trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41 biến trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40là một phần của thư viện chuẩn của Python , có nghĩa là nó luôn có sẵn để nhập khi bạn đang chạy Python.

Các gói

Lưu ý rằng bạn viết 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
44và không chỉ đơn giản 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41. Ngoài việc là một mô-đun, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40hoạt động như một không gian tên giữ tất cả các thuộc tính của mô-đun lại với nhau. Không gian tên rất hữu ích để giữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters:

Một mô-đun Python có thể chứa các mô-đun con hoặc đệ quy, các gói con. Về mặt kỹ thuật, một gói là một mô-đun Python có một 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
56thuộc tính. ( Nguồn )

Lưu ý rằng một gói vẫn là một mô-đun. Là một người dùng, bạn thường không cần phải lo lắng về việc bạn đang nhập một mô-đun hay một gói.

Trong thực tế, một gói thường tương ứng với một thư mục tệp chứa tệp Python và các thư mục khác. Để tự tạo một gói Python, bạn tạo một thư mục và một tệp có tên

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57 bên trong nó. Các 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tập tin có chứa các nội dung của gói khi nó được coi là một mô-đun. Nó có thể được để trống.

Lưu ý: Các thư mục không có 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tệp vẫn được Python coi là gói. Tuy nhiên, đây không phải là các gói thông thường, mà là một thứ được gọi là các gói không gian tên . Bạn sẽ tìm hiểu thêm về chúng sau này .

Nói chung, các mô-đun con và gói con không được nhập khi bạn nhập một gói. Tuy nhiên, bạn có thể sử dụng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57để bao gồm bất kỳ hoặc tất cả các mô-đun con và gói con nếu bạn muốn. Để hiển thị một vài ví dụ về hành vi này, bạn sẽ tạo một gói để nói 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
61bằng một vài ngôn ngữ khác nhau. Gói này sẽ bao gồm các thư mục và tệp sau:

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

Mỗi tệp quốc gia sẽ in ra một lời chào, trong khi các 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tệp nhập một số gói con và mô-đun con một cách chọn lọc. Nội dung chính xác của các tệp như 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

Lưu ý rằng 

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
64và không nhập khẩu 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

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

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

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
70. Mỗi mô-đun quốc gia sẽ in lời chào khi được nhập.

Hãy chơi với 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
71gói tại dấu nhắc tương tác để hiểu rõ hơn về cách các gói con và mô-đun con hoạt độ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'

Khi 

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

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
74mô-đun cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập:

>>>

>>> # 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', ...]
65được nhập, các mô-đun 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
74mô-đun cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập:

>>>

>>> # 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', ...]
65được nhập, các mô-đun 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
74mô-đun cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập:

Các 

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
76gói sẽ tạo ra không gian tên nhưng không có tác dụng nào khác:

>>>

>>> import math
>>> math.__dict__["pi"]
3.141592653589793

Khi 

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

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
74mô-đun cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập:

Các 

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
76gói sẽ tạo ra không gian tên nhưng không có tác dụng nào khác:

Hãy nhớ rằng, nhập một mô-đun vừa tải nội dung vừa tạo 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 có thể cùng một mô-đun là một phần của các không gian tên khác nhau.

Chi tiết kỹ thuật: Không gian tên mô-đun được triển khai dưới dạng từ điển Python và có sẵn tại >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 77thuộc tính:

Bạn hiếm khi cần phải tương tác 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
77trực tiếp với .

Tương tự, không gian tên toàn cục của Python cũng là một từ điển. Bạn có thể truy cập nó thông qua 

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

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

Việc nhập các gói con và mô-đun con trong một 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tệp tin để làm cho chúng dễ sử dụng hơn cho người dùng của bạn là điều khá phổ biến . Bạn có thể xem một ví dụ về điều này trong 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
81gói 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', ...]
63trong ví dụ trước đó:

Bạn đã từng thấy những 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
83câu như vậy 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

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

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
86có nghĩa là gì?

Dấu chấm đề cập đến gói hiện tại và câu lệnh là một ví dụ về nhập tương đối . Bạn có thể đọc nó là “Từ gói hiện tại, hãy nhập gói con 

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

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

Có một câu lệnh nhập tuyệt đối tương đương trong đó bạn đặt tên rõ ràng cho gói hiện tại:

Trên thực tế, tất cả các hoạt động nhập khẩu vào 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
71có thể đã được thực hiện một cách rõ ràng với các nhập khẩu tuyệt đối tương tự.

Nhập tương đối phải ở dạng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
83và vị trí bạn đang nhập phải bắt đầu bằng dấu chấm.

Đặc biệt, nó sẽ tìm kiếm trong bộ nhớ cache của mô-đun để xem liệu 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
91đã được nhập chưa và nó sẽ tìm kiếm trong số các mô-đun được tích hợp sẵn.

Bạn sẽ tìm hiểu thêm về máy móc nhập Python đầy đủ trong phần sau .

Bạn có thể kiểm tra đường dẫn nhập của Python bằng cách in 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
93. Nói chung, danh sách này sẽ chứa ba loại địa điểm khác nhau:

  1. 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 đang chạy tương tác)
  2. Nội dung của 
    >>> import math
    >>> dir()
    ['__annotations__', '__builtins__', ..., 'math']
    
    >>> dir(math)
    ['__doc__', ..., 'nan', 'pi', 'pow', ...]
    
    94biến môi trường
  3. Các thư mục khác, phụ thuộc vào cài đặt

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 trong mỗi vị trí cho đến khi khớp đầu tiên. Vì thư mục tập lệnh hoặc thư mục hiện tại luôn nằm đầ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 mình tìm thấy các mô-đun và gói tự tạo 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ề việc bạn chạy Python từ thư mục nào.

Tuy nhiên, bạn cũng nên cẩn thận rằng bạn không tạo các mô-đun làm bóng hoặc ẩn các mô-đun quan trọng khác. Ví dụ, giả sử rằng bạn xác định 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40mô-đun sau :

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

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

Sử dụng mô-đun này hoạt động như mong đợi:

>>>

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

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

Nhưng mô-đun này cũng che bóng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40mô-đun được 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 đó của chúng tôi về việc tìm kiếm giá trị của π không còn hoạt động nữa:

>>>

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

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

Nhưng mô-đun này cũng che bóng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40mô-đun được 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 đó của chúng tôi về việc tìm kiếm giá trị của π không còn hoạt động nữa:

Vấn đề là Python hiện tìm kiếm 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40mô-đun mới của bạn 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
41thay vì tìm kiếm 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40mô-đun trong thư viện chuẩn.

Để tránh những 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 mình. Đặc biệt, tên gói và mô-đun cấp cao nhất của bạn phải là duy nhất. Nếu >>> import math >>> dir() ['__annotations__', '__builtins__', ..., 'math'] >>> dir(math) ['__doc__', ..., 'nan', 'pi', 'pow', ...] 40được định nghĩa là một mô-đun con trong một gói, thì nó sẽ không phủ bóng mô-đun tích hợp sẵn.

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

Mặc dù bạn có thể sắp xếp việc nhập bằng cách sử dụng thư mục hiện tại cũng như bằng cách thao tác 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
94và thậm chí 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
93, quá trình này thường không cầu kỳ và dễ xảy ra lỗi. Để xem một ví dụ điển hình, hãy xem xét ứng dụng sau:

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

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

Ứng dụng sẽ tạo lại cấu trúc tệp nhất định bằng cách tạo thư mục và tệp trống. Các 

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

>>> math.pi
NameError: name 'math' is not defined
03tập tin có chứa các kịch bản chính, và 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
04là một module thư viện với một vài chức năng để đối phó với các tập tin. Sau đây là một ví dụ về kết xuất từ ​​ứng dụng, trong trường hợp này là chạy nó trong 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
05thư mục:

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

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

>>> math.pi
NameError: name 'math' is not defined
06tệp được tạo tự động được tạo lại bên trong một thư mục mới có tên 
>>> from math import pi
>>> pi
3.141592653589793

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

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

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

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 

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

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

Trong các dòng từ 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 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
09phân cấp tệp mà bạn sẽ tạo lại.

Công việc thực tế xảy ra từ dòng 19 đến dòng 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
10, đó sẽ là đường dẫn 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 bản gốc 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
09và tạo lại chúng dưới dạng tệp trống bên trong hệ thống phân cấp tệp mới.

Đối với thao tác với các đường dẫn như thế này, 

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

>>> math.pi
NameError: name 'math' is not defined
12trong thư viện tiêu chuẩn là khá hữu ích. Để biết thêm chi tiết về cách nó được sử dụng, hãy xem Mô-đun của Python 3 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
12: Điều chỉnh hệ thống tệp .

Ở dòng 26 , bạn gọi 

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

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

>>> math.pi
NameError: name 'math' is not defined
15bài kiểm tra ở 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
16có giá trị 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
17bên trong các tập lệnh, nhưng nó nhận tên của mô-đun bên trong các mô-đun được nhập. Để biết thêm thông tin 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
16, hãy xem Định nghĩa các hàm chính trong Python .

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

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

Lưu ý rằng bạn nhập 

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

>>> math.pi
NameError: name 'math' is not defined
19trên dòng 8 . Mô-đun thư viện này chứa hai chức năng tiện ích:

Hãy xem xét việc nhập 

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

>>> math.pi
NameError: name 'math' is not defined
19lại:

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

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

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. Ngay cả khi bạn nhập 

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

>>> math.pi
NameError: name 'math' is not defined
19từ 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
05dự án, quá trình nhập là tuyệt đối : nó không bắt đầu bằng dấu chấm. Điều này có nghĩa là 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
19phải được tìm thấy trong đường dẫn nhập để nhập hoạt động.

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 của Python, vì vậy điều này hiện hoạt động tốt. 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ụ: một người nào đó có thể muốn nhập tập lệnh vào một Máy tính xách tay Jupyter và chạy nó từ đó. Hoặc họ có thể muốn sử dụng lại 

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

>>> math.pi
NameError: name 'math' is not defined
19thư viện trong một dự án khác. Họ thậm chí có thể tạo tệp thực thi bằng PyInstaller để dễ dàng phân phối tệp đó hơn. Thật không may, bất kỳ trường hợp nào trong số này đều có thể tạo ra sự cố với việc nhập 
>>> from math import pi
>>> pi
3.141592653589793

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

Để xem ví dụ, bạn có thể làm theo hướng dẫn PyInstaller và tạo một điểm vào ứng dụng của mình . 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', ...]
8

Trong thư mục bên ngoài, tạo ra các kịch bản điểm nhập cảnh, 

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

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

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

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

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

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

>>> math.pi
NameError: name 'math' is not defined
14từ 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
14không chạy khi 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
05được nhập vì 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
15thử nghiệm trên dòng 25 in 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
03. Đ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
14một cách rõ ràng.

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:

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

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

Tại sao điều đó không hoạt động? Đột nhiên, quá trình nhập 

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

>>> math.pi
NameError: name 'math' is not defined
19phát sinh lỗi.

Vấn đề là bằng cách khởi động ứng dụng bằng 

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

>>> math.pi
NameError: name 'math' is not defined
30, 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
19không còn trên đường dẫn nhập nữa, vì vậy không thể nhập tuyệt đối.

Một giải pháp khả thi là thay đổi đường dẫn nhập của Python:

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

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

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

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

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

>>> math.pi
NameError: name 'math' is not defined
04. Vấn đề với cách tiếp cận này là đường dẫn nhập của bạn có thể rất lộn xộn và khó hiểu.

Trong thực tế, bạn đang tạo lại một tính năng của các phiên bản Python đầu tiên được gọi là nhập tương đối ngầm định . Những điều này đã bị loại bỏ khỏi ngôn ngữ bởi PEP 328 với lý do sau:

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

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

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

Một giải pháp khác là sử dụng nhập tương đối để thay thế. Thay đổi nhập 

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

>>> math.pi
NameError: name 'math' is not defined
03như sau:

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

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

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
3

Rất tiếc, bạn không thể gọi ứng dụng trực tiếp được nữa:

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

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

Vấn đề là việc nhập tương đối được giải quyết trong các tập lệnh khác với các mô-đun được nhập. Tất nhiên, bạn có thể quay lại và khôi phục quá trình nhập tuyệt đối trước khi chạy trực tiếp tập lệnh hoặc thậm chí bạn có thể thực hiện một số động tác 

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

>>> math.pi
NameError: name 'math' is not defined
44nhào lộn để nhập tệp hoàn toàn hoặc tương đối tùy thuộc vào những gì hoạt động.

Thậm chí còn có một vụ hack được chính thức xử phạt để làm cho việc nhập tương đối hoạt động trong các tập lệnh. 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', ...]
93trong hầu hết các trường hợp. Trích lời 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 của Python và cài đặt dự án của bạn dưới dạng gói cục bộ bằng cách sử dụng

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

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

Tạo và cài đặt gói cục bộ

Khi bạn cài đặt mộ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ách tương tự.

Tạo một gói cục bộ không liên quan nhiều đến chi phí. Đầu tiên, tạo tối thiểu 

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

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

>>> math.pi
NameError: name 'math' is not defined
48các tệp trong 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
05thư mục bên ngoài :

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

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

Về lý thuyết, cái 

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

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

>>> math.pi
NameError: name 'math' is not defined
51có thể là bất cứ thứ gì bạn thích. Tuy nhiên, chúng sẽ được sử dụng 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
46khi tham chiếu đến gói của bạn, vì vậy bạn nên chọn các giá trị dễ nhận biết và không đụng 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 cục bộ như vậy một tiền tố chung như 

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

>>> math.pi
NameError: name 'math' is not defined
53hoặ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
54nên liệt kê thư mục hoặc cá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
46:

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

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

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

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

>>> math.pi
NameError: name 'math' is not defined
05sau đó sẽ được tìm thấy trên đường dẫn nhập của 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 tương đối hoặc các biến chứng khác. Các 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
57tùy chọn là viết tắt của có thể chỉnh sửa , đó là quan trọng vì nó cho phép bạn thay đổi mã nguồn của gói của bạn mà không cần cài đặt lại nó.

Lưu ý: Loại tệp thiết lập này hoạt động tốt khi bạn đang làm việc với các dự án của riêng mình. Tuy nhiên, nếu bạn định chia sẻ mã với người khác, thì bạn nên thêm một số thông tin vào tệp thiết lập của mình.

Để biết thêm chi tiết về các tệp thiết lập, hãy xem Cách xuất bản Gói Python nguồn mở lên PyPI .

Bây giờ nó đã 

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

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

Điều này sẽ hoạt động bất kể bạn kết thúc cuộc gọi ứng dụng của mình như thế nào.

Mẹo: Trong mã của riêng bạn, bạn nên tách các tập lệnh và thư viện một cách có ý thức. Đây là một nguyên tắc nhỏ:

  • Một tập lệnh được dùng để chạy.
  • Một thư viện có nghĩa là được nhập.

Bạn có thể có mã mà bạn muốn vừa chạy riêng vừa nhập từ các tập lệnh khác. Trong trường hợp đó, thường nên cấu trúc lại mã của bạn để bạn chia phần chung thành một mô-đun thư viện.

Mặc dù tách các tập lệnh và thư viện là một ý tưởng hay, nhưng tất cả các tệp Python đều 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ẽ đến các tệp 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ỉ hoạt động như không gian tên mà không thực thi cách tổ chức mã nguồn. Xem thảo luận trong PEP 402 để biết các ví dụ.

Các gói không gian tên đã có sẵn bằng Python kể từ phiên bản 3.3. Chúng ít phụ thuộc hơn vào hệ thống phân cấp tệp cơ bản. Đặc biệt, các gói không gian tên có thể được chia thành 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 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
38tệp nhưng không có 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57. Xem PEP 420 để biết giải thích chi tiết.

Lưu ý: Nói một cách chính xác, các gói không gian tên ngầm định đã được giới thiệu trong Python 3.3. Trong các phiên bản Python trước, bạn có thể tạo các gói vùng tên theo cách thủ công theo một số cách không tương thích khác nhau . PEP 420 thống nhất và đơn giản hóa các phương pháp tiếp cận trước đó.

Để 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, chúng ta hãy thử triển khai một gói. Như một ví dụ thúc đẩy, bạn sẽ có một bước đi khác về vấn đề được giải quyết trong Mô hình phương pháp nhà máy và Triển khai của nó bằng Python : với một 

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

>>> math.pi
NameError: name 'math' is not defined
61đối tượng, bạn muốn chuyển đổi nó thành một trong số các biểu diễn chuỗi. Nói cách khác, bạn muốn tuần tự hóa 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
61 các đối tượng.

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

>>>

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

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

Hãy giả sử rằng bạn may mắn và bắt gặp việc triển khai của bên thứ ba một số định dạng mà bạn cần tuần tự hóa tới 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
9

Tệp 

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

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

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

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

Giao diện serializer này có một chút hạn chế, nhưng nó sẽ đủ để chứng minh cách hoạt động của các gói không gian tên.

Tệp 

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

>>> math.pi
NameError: name 'math' is not defined
64chứa một tệp tương tự 
>>> from math import pi
>>> pi
3.141592653589793

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

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

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

Lưu ý rằng cả hai lớp thực hiện cùng một giao diện với 

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

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

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

>>> math.pi
NameError: name 'math' is not defined
68phương pháp.

Sau đó, bạn tạo một 

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

>>> math.pi
NameError: name 'math' is not defined
61lớp có thể sử dụng các trình tuần tự này:

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

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

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

>>> math.pi
NameError: name 'math' is not defined
61được xác định bởi ID, chức danh 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
71không cần biết nó chuyển đổi sang định dạng nào vì nó sử dụng giao diện chung được xác định trước đó.

Giả sử rằng bạn đã cài đặt 

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

>>> math.pi
NameError: name 'math' is not defined
72gói 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
3

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

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

>>> math.pi
NameError: name 'math' is not defined
71, bạn sẽ có được các bản trình bày khác nhau cho bài hát của mình.

Lưu ý: Bạn có thể nhận được một 

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

>>> math.pi
NameError: name 'math' is not defined
74hoặc một 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
75khi tự chạy mã. Điều này là do 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
72không có trong đường dẫn nhập Python của bạn . Bạn sẽ sớm thấy cách giải quyết vấn đề đó.

Càng xa càng tốt. Tuy nhiên, bây giờ bạn nhận ra rằng bạn cũng cần phải 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 sự kỳ diệu của các gói không gian tên: bạn có thể thêm gói của riêng mình 

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

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

>>> math.pi
NameError: name 'math' is not defined
72gói mà không cần chạm vào thư viện của bên thứ ba.

Đầu tiên, tạo một thư mục trên hệ thống tệp cục bộ của bạn có tên 

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

>>> math.pi
NameError: name 'math' is not defined
72. Điều quan trọng là tên của thư mục phải khớp với tên của gói không gian tên mà bạn đang tùy chỉnh:

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

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

Trong 

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

>>> math.pi
NameError: name 'math' is not defined
80tệp, bạn xác định của riêng bạn 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
77. Bạn căn cứ vào 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82gói này , gói 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
5

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
83:

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

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

Lưu ý rằng dấu 

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

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

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

>>> math.pi
NameError: name 'math' is not defined
72chính nó. Kể từ khi cả hai 
>>> from math import pi
>>> pi
3.141592653589793

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

>>> math.pi
NameError: name 'math' is not defined
88là một phần của gói namespace cùng, thậm chí bạn có thể sử dụng một khẩu tương đối: 
>>> from math import pi
>>> pi
3.141592653589793

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

Tiếp tục ví dụ trên, bây giờ bạn cũng có thể chuyển đổi bài hát sang YAML:

>>>

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

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

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

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

>>> math.pi
NameError: name 'math' is not defined
71, bạn sẽ có được các bản trình bày khác nhau cho bài hát của mình.

Lưu ý: Bạn có thể nhận được một 

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

>>> math.pi
NameError: name 'math' is not defined
74hoặc một 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
75khi tự chạy mã. Điều này là do 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
72không có trong đường dẫn nhập Python của bạn . Bạn sẽ sớm thấy cách giải quyết vấn đề đó.

Càng xa càng tốt. Tuy nhiên, bây giờ bạn nhận ra rằng bạn cũng cần phải 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 sự kỳ diệu của các gói không gian tên: bạn có thể thêm gói của riêng mình 

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

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

>>> math.pi
NameError: name 'math' is not defined
72gói mà không cần chạm vào thư viện của bên thứ ba.

Đầu tiên, tạo một thư mục trên hệ thống tệp cục bộ của bạn có tên 

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

>>> math.pi
NameError: name 'math' is not defined
72. Điều quan trọng là tên của thư mục phải khớp với tên của gói không gian tên mà bạn đang tùy chỉnh:

Trong 

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

>>> math.pi
NameError: name 'math' is not defined
80tệp, bạn xác định của riêng bạn 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
77. Bạn căn cứ vào 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
82gói này , gói 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
8

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
83:

Lưu ý rằng dấu >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 77dựa trên >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 83, được nhập từ >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 72chính nó. Kể từ khi cả hai >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 87và >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 88là một phần của gói namespace cùng, thậm chí bạn có thể sử dụng một khẩu tương đối: >>> from math import pi >>> pi 3.141592653589793 >>> math.pi NameError: name 'math' is not defined 89.

Tiếp tục ví dụ trên, bây giờ bạn cũng có thể chuyển đổi bài hát sang YAML:

  • Cũng 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 đang làm theo cùng với các ví dụ trước, thì có thể bạn đã gặp vấn đề với việc không tìm thấy Python 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    72. 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
    
    46để cài đặt thư viện của bên thứ ba, vì vậy nó sẽ tự động nằm trong đường dẫn của bạn.
  • Lưu ý: Trong ví dụ ban đầu , việc lựa chọn bộ nối tiếp được thực hiện linh hoạt hơn. Bạn sẽ thấy cách sử dụng các gói không gian tên trong một mẫu phương pháp gốc thích hợp sau này .
  • Bạn cũng nên đảm bảo rằng thư viện cục bộ của bạn có sẵn giống như một gói thông thường. Như đã giải thích ở trên, bạn có thể thực hiện việc này bằng cách chạy Python từ thư mục thích hợp hoặc bằng cách sử dụng 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    46để cài đặt thư viện cục bộ.
  • Trong ví dụ này, bạn đang thử nghiệm cách tích hợp gói bên thứ ba giả mạo với gói cục bộ của mình. Nếu 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    93là một gói thực, thì bạn sẽ tải xuống từ PyPI bằng cách sử dụng 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    46. Vì điều này là không 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
    
    93cục bộ giống như bạn đã làm trong 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    05ví dụ trước đó .
  • Ngoài ra, bạn có thể làm rối với đường dẫn nhập của mình. Đặt 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    93và 
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    98các thư mục 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:
  • Giờ đây, bạn có thể sử dụng tất cả các bộ tuần tự hóa mà không cần lo lắng về việc chúng được xác định trong gói của bên thứ ba hay cục bộ.

Hướng dẫn kiểu nhập khẩu

PEP 8 , hướng dẫn kiểu Python, có một số khuyến nghị về việc nhập . Như mọi khi với Python, giữ cho mã của bạn vừa có thể đọc được vừa có thể bảo trì là một điều quan trọng cần cân nhắc. Dưới đây là một số quy tắc chung về cách tạo kiểu cho các mục nhập của bạn:

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

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

Giữ các mục nhập ở đầu tệp.

Có những trường hợp nên uốn cong những 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 phân cấp gói. Sau đó , bạn sẽ thấy cách trong một số trường hợp, bạn có thể chuyển nhập vào một định nghĩa hàm để phá vỡ các chu kỳ nhập.

Nhập tài nguyên

Đôi khi bạn sẽ có mã phụ thuộc vào tệp dữ liệu hoặc các tài nguyên khác. Trong các tập lệnh nhỏ, đây không phải là vấn đề — bạn có thể chỉ định đường dẫn đến tệp dữ liệu của mình và tiếp tục!

Tuy nhiên, nếu tệp tài nguyên quan trọng đối với gói của bạn và bạn muốn phân phối gói của mình cho những người dùng khác, thì một số thách thức sẽ phát sinh:

  1. Bạn sẽ không có quyền kiểm soát đường dẫn đến tài nguyên vì điều đó sẽ phụ thuộc vào thiết lập của người dùng của bạn cũng như cách gói được phân phối và cài đặt. Bạn có thể cố gắng tìm ra đường dẫn tài nguyên dựa trên gói 

    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    04hoặc 
    >>> import math
    >>> dir()
    ['__annotations__', '__builtins__', ..., 'math']
    
    >>> dir(math)
    ['__doc__', ..., 'nan', 'pi', 'pow', ...]
    
    56thuộc tính của bạn, nhưng điều này có thể không phải lúc nào cũng hoạt động như mong đợi.

  2. Gói của bạn có thể cư trú bên trong một file ZIP hoặc một tuổi 

    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    06tập tin , trong trường hợp tài nguyên thậm chí sẽ không thể là một tập tin vật lý trên hệ thống của người dùng.

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
07. Tuy nhiên, với việc đưa 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
08vào thư viện tiêu chuẩn trong Python 3.7 , bây giờ có một cách tiêu chuẩn để xử lý các tệp tài nguyên.

Giới thiệu >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 08

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08cấp quyền truy cập vào các tài nguyên trong các gói. Trong ngữ cảnh này, tài nguyên là bất kỳ tệp nào nằm trong một gói có thể nhập. Tệp có thể có hoặc không tương ứng với tệp vật lý trên hệ thống tệp.

Đ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 sẽ có cách xử lý các tệp bên trong các gói của mình một cách nhất quán hơn. Nó cũng cho phép bạ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óm tắt nó một cách độc đáo:

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08đã trở thành một phần của thư viện chuẩn trong Python 3.7. Tuy nhiên, trên các phiên bản cũ hơn của Python, một cổng hỗ trợ có sẵn dưới dạng
>>> import math as m
>>> m.pi
3.141592653589793

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

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

Backport tương thích với Python 2.7 cũng như Python 3.4 và các phiên bản mới hơn.

Có một yêu cầu khi sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08: các tệp tài nguyên của bạn phải có sẵn bên trong một gói thông thường. Gói không gian tên không được hỗ trợ. Trong thực tế, điều này có nghĩa là tệp phải nằm trong thư mục chứa 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tệp.

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
1

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57chỉ 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
16là một 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
17và 
>>> import math as m
>>> m.pi
3.141592653589793

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

>>>

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

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
18tương đương với built-in 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
21với các 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
22tham số thiết lập để 
>>> import math as m
>>> m.pi
3.141592653589793

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

>>> from math import pi as PI
>>> PI
3.141592653589793
24, tương ứng. Các chức năng thuận tiện để đọc trực tiếp văn bản hoặc tệp nhị phân cũng có sẵn như 
>>> import math as m
>>> m.pi
3.141592653589793

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

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

Lưu ý: Để sử dụng backport một cách liền mạch trên các phiên bản Python cũ hơn, bạn có thể nhập 

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

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

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

Xem phần mẹo và thủ thuật của hướng dẫn này để biết thêm thông tin.

Phần còn lại của phần này sẽ trình bày một vài ví dụ phức tạp về việc sử dụng tệp tài nguyên trong thực tế.

Ví dụ: Sử dụng tệp dữ liệu

Là một ví dụ đầy đủ hơn về việc sử dụng tệp dữ liệu, bạn sẽ thấy cách triển khai chương trình đố vui dựa trên dữ liệu dân số của Liên hợp quốc . Đầu tiên, hãy tạo một 

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
29từ 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
4

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
5

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 biết loại kịch bản nào được sử dụng cho dự báo. Tệp này chứa các dự báo về dân số cho đến năm 2100.

Hàm sau đọc tệp này và chọn ra tổng dân số của mỗi quốc gia cho một 

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

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

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

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

Các dòng được đánh dấu hiển thị cách 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08được sử dụng để mở tệp dữ liệu. Để biết thêm thông tin về cách làm việc với tệp CSV, hãy xem Đọc và Viết tệp CSV bằng Python .

Hàm trên trả về một từ điển với các số dân số:

>>>

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

Bạn có thể làm bất kỳ điều gì thú vị với từ điển dân số này, bao gồm cả phân tích và hình dung. Tại đây, bạn sẽ tạo một trò chơi đố yêu cầu người dùng xác định quốc gia nào trong tập hợp là đông dân nhất. Chơi trò chơi sẽ trông giống như sau:

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

Các chi tiết của việc thực hiện nằm quá xa chủ đề của hướng dẫn này, vì vậy chúng sẽ không được thảo luận ở đây. Tuy nhiên, bạn có thể mở rộng phần bên dưới để xem mã nguồn hoàn chỉnh.

Ví dụ: Thêm biểu tượng vào Tkinter GUIs

Khi xây dựng giao diện người dùng đồ họa (GUI), bạn thường cần bao gồm các tệp tài nguyên như biểu tượng. Ví dụ sau đây cho thấy cách bạn có thể làm điều đó bằng cách sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08. Ứng dụng cuối cùng sẽ trông khá cơ bản, nhưng nó sẽ có biểu tượng tùy chỉnh cũng như hình minh họa trên nút Tạm biệt :

Hướng dẫn python from file import - python từ nhập tệp

Ví dụ sử dụng Tkinter , là một gói GUI có sẵn trong thư viện tiêu chuẩn. Nó dựa trên hệ thống cửa sổ Tk , ban đầu được phát triển cho ngôn ngữ lập trình Tcl. Có nhiều gói GUI khác có sẵn cho Python. Nếu bạn đang sử dụng một biểu tượng khác, thì bạn sẽ có thể thêm các biểu tượng vào ứng dụng của mình bằng cách sử dụng các ý tưởng tương tự như những biểu tượng được trình bày ở đây.

Trong Tkinter, hình ảnh được xử lý bởi 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
34lớp . Để tạo một 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
34, bạn chuyển một đường dẫn đến một tệp hình ảnh.

Hãy nhớ rằng, khi phân phối gói của bạn, bạn thậm chí không được đảm bảo rằng các tệp tài nguyên sẽ tồn tại dưới dạng tệp vật lý trên hệ thống tệp. 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08giả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
37. Hàm này sẽ trả về một đường dẫn đến tệp tài nguyên, tạo một tệp tạm thời nếu cần.

Để đảm bảo mọi tệp tạm thời được dọn dẹp đúng cách, bạn nên sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
37làm trình quản lý ngữ cảnh bằng từ khóa 
>>> import math as m
>>> m.pi
3.141592653589793

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

>>>

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

Bạn có thể làm bất kỳ điều gì thú vị với từ điển dân số này, bao gồm cả phân tích và hình dung. Tại đây, bạn sẽ tạo một trò chơi đố yêu cầu người dùng xác định quốc gia nào trong tập hợp là đông dân nhất. Chơi trò chơi sẽ trông giống như 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
0

Các chi tiết của việc thực hiện nằm quá xa chủ đề của hướng dẫn này, vì vậy chúng sẽ không được thảo luận ở đây. Tuy nhiên, bạn có thể mở rộng phần bên dưới để xem mã nguồn hoàn chỉnh.

Ví dụ: Thêm biểu tượng vào Tkinter GUIs

Khi xây dựng giao diện người dùng đồ họa (GUI), bạn thường cần bao gồm các tệp tài nguyên như biểu tượng. Ví dụ sau đây cho thấy cách bạn có thể làm điều đó bằng cách sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08. Ứng dụng cuối cùng sẽ trông khá cơ bản, nhưng nó sẽ có biểu tượng tùy chỉnh cũng như hình minh họa trên nút Tạm biệt :

Ví dụ sử dụng Tkinter , là một gói GUI có sẵn trong thư viện tiêu chuẩn. Nó dựa trên hệ thống cửa sổ Tk , ban đầu được phát triển cho ngôn ngữ lập trình Tcl. Có nhiều gói GUI khác có sẵn cho Python. Nếu bạn đang sử dụng một biểu tượng khác, thì bạn sẽ có thể thêm các biểu tượng vào ứng dụng của mình bằng cách sử dụng các ý tưởng tương tự như những biểu tượng được trình bày ở đây.

# 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

Trong Tkinter, hình ảnh được xử lý bởi 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
34lớp . Để tạo một 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
34, bạn chuyển một đường dẫn đến một tệp hình ảnh.

Hãy nhớ rằng, khi phân phối gói của bạn, bạn thậm chí không được đảm bảo rằng các tệp tài nguyên sẽ tồn tại dưới dạng tệp vật lý trên hệ thống tệp. 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08giả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
37. Hàm này sẽ trả về một đường dẫn đến tệp tài nguyên, tạo một tệp tạm thời nếu cần.

Để đảm bảo mọi tệp tạm thời được dọn dẹp đúng cách, bạn nên sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
37làm trình quản lý ngữ cảnh bằng từ khóa 
>>> import math as m
>>> m.pi
3.141592653589793

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

Đối với ví dụ đầy đủ, giả sử bạn có cấu trúc 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:

>>>

# 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

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
40. Tên này chỉ ra rằng tệp là điểm vào của gói. Có một 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40tệp cho phép gói của bạn được thực thi với 
>>> import math as m
>>> m.pi
3.141592653589793

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

Để biết thêm thông tin về cách gọi một gói với 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
43, hãy xem Cách xuất bản Gói Python nguồn mở lên 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
3

Để tìm hiểu thêm về các hàm lambda, hãy xem Cách sử dụng các hàm Lambda trong Python .

Trong phần này, bạn sẽ học cách nhập động bằng Python. Với chúng, bạn sẽ không phải quyết định nhập những gì 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 54

Cho đến nay, bạn đã sử dụng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
35từ khóa của Python để nhập các mô-đun và gói một cách rõ ràng. Tuy nhiên, toàn bộ máy móc nhập khẩu có sẵn trong 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
54gói và điều này cho phép bạn thực hiện việc nhập khẩu của mình một cách linh hoạt hơn. Tập lệnh sau yêu cầu người dùng nhập tên mô-đun, nhập mô-đun đó và in chuỗi tài liệu của 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
4

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

>>> from math import pi as PI
>>> PI
3.141592653589793
57trả 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ư 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
5

Trong mỗi trường hợp, mô-đun được nhập động bằng 

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

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

Ví dụ: Phương pháp ban đầu với các gói không gian tên

Hãy nghĩ lại ví dụ về serializers trước đó. Với 

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

>>> math.pi
NameError: name 'math' is not defined
72việc triển khai dưới dạng gói không gian tên, bạn có khả năng thêm bộ tuần tự tùy chỉnh. Trong ví dụ ban đầu từ một hướng dẫn trước, các bộ nối tiếp được tạo sẵn thông qua một nhà máy sản xuất bộ nối tiếp. Sử dụng 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
54, bạn có thể làm điều gì đó tương tự.

Thêm mã sau vào 

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

>>> math.pi
NameError: name 'math' is not defined
72gói không gian tên cục bộ của 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
6

Nhà 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
62máy có thể tạo bộ tuần tự động dựa trên 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
63tham số và 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
64sau đó có thể áp dụng bộ tuần tự cho bất kỳ đối tượng nào triển khai một 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
71phương thức.

Nhà máy đưa ra một số giả định mạnh mẽ về việc đặt tên cho cả mô-đun và lớp chứa các bộ tuần tự riêng lẻ. Trong phần tiếp theo , bạn sẽ tìm hiểu về kiến ​​trúc plugin cho phép linh hoạt hơn.

Bây giờ bạn có thể tạo lại ví dụ trước đó như 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
7

Trong trường hợp này, bạn không cần nhập từng bộ nối tiếp một cách rõ ràng nữa. Thay vào đó, bạn chỉ định tên của bộ nối tiếp bằng một chuỗi. Chuỗi thậm chí có thể được chọn bởi người dùng của bạn trong thời gian chạy.

Lưu ý: Trong một gói thông thường, bạn có thể đã triển khai 

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
64trong một 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57tệp. Điều đó sẽ cho phép bạn chỉ cần nhập 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
72và sau đó gọi 
>>> import math as m
>>> m.pi
3.141592653589793

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

Tuy nhiên, các gói không gian tên không được phép sử dụng 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
57, vì vậy bạn cần phải triển khai các chức năng này trong một mô-đun riêng biệt.

Ví dụ cuối cùng cho thấy rằng bạn cũng nhận được một thông báo lỗi khá nếu bạn cố gắng tuần tự hóa sang một định dạng chưa được triển khai.

Ví dụ: Một gói các plugin

Hãy xem xét một ví dụ khác về việc sử dụng nhập động. Bạn có thể sử dụng mô-đun sau để thiết lập kiến ​​trúc plugin linh hoạt trong mã của mình. Điều này tương tự như ví dụ trước, trong đó bạn có thể cắm bộ tuần tự cho các định dạng khác nhau bằng cách thêm các mô-đun mới.

Một ứng dụng sử dụng plugin hiệu quả là công cụ trực quan hóa 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 không đượ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 để Keo dễ dàng tìm thấy. 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 để biết 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 có liên quan tương ứng với một gói Python.
  2. Plugin là một hành vi tùy chỉnh được tạo sẵn trong một mô-đun Python.

Các 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
72mô-đun đó cho thấy nhiều 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
8

Các chức năng gốc được sử dụng để thêm chức năng vào các gói plugin một cách thuận tiện. Bạn sẽ thấy một số ví dụ về cách chúng được sử dụng trong thời gian ngắn.

Xem xét 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ể xem cách triển khai bằng cách mở rộng phần bên dưới.

Hãy xem một số ví dụ về cách sử dụng plugin. Ví dụ đầu tiên là một 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
73gói 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 đối với ví dụ này, nhưng nó cho thấy cách các plugin hoạt động.

Giả sử bạn có 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
73gói 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
9

Mỗi 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
73mô-đun xác định một hàm nhận một 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
50đối số. Lưu ý cách tất cả chúng được đăng ký làm plugin bằng trình 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
77trang trí:

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

Để tìm hiểu thêm về trình trang trí và cách chúng được sử dụng, hãy xem Primer trên Trình trang trí Python .

Lưu ý: Để đơn giản hóa việc khám phá và nhập các plugin, tên của mỗi plugin dựa trên tên của mô-đun chứa nó thay vì tên chức năng. Điều này hạn chế bạn chỉ có một plugin cho mỗi tệp.

Để hoàn tất thiết lập 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
73dưới dạng gói plugin, bạn có thể sử dụng các chức năng của nhà máy 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
72để thêm chức năng vào 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
73chính 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'
1

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
81và 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
82như 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'
2

Lưu ý rằng 

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

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

Bạn cũng có thể chọn một cách linh hoạt hơ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 thông tin người dùng nhập:

>>>

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

Lưu ý rằng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
81tự động phát hiện 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'
4

Bạn cũng có thể chọn một cách linh hoạt hơ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 thông tin người dùng nhập:

  1. Để khám phá và gọi các plugin khác nhau, bạn cần nhập chúng. Hãy xem nhanh cách 
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    72xử lý nhập khẩu. Công việc chính được thực hiện trong hai chức năng sau bên trong 
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    85:
  2. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    86trông thẳng thắn một cách lừa dối. Nó sử dụng 
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    54để nhập một mô-đun. Nhưng có một số điều cũng xảy ra trong nền:
  3. Hệ thống nhập của Python đả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
77 decorator được xác định bên trong mỗi mô-đun plugin đăng ký mỗi plugin đã nhập.

  1. Trong quá trình triển khai đầy đủ, cũng sẽ có một số lỗi xử lý để đối phó với các plugin bị thiếu.
  2. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    89khám phá tất cả các plugin trong một gói. Đây là cách nó hoạt động:
  3. >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    90từ 
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    08danh sách tất cả các tệp bên trong một gói.
  4. 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 bằng dấu gạch dưới được nhập.

Các 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'
5

Hãy kết thúc phần này với phiên bản cuối cùng của gói không gian tên serializers . Một vấn đề nổi bật là 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
62nhà máy đã đưa ra những giả định mạnh mẽ về việc đặt tên cho các lớp serializer. Bạn có thể làm cho điều này linh hoạt hơn bằng cách sử dụ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'
6

Đầu tiên, thêm một dòng đăng ký từng bộ tuần tự. Đây là một ví dụ về cách nó được thực hiện trong bộ 

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

>>> math.pi
NameError: name 'math' is not defined
88tuần tự:

Tiếp theo, cập nhật 

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

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

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

Bạn thực hiện >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 62bằng cách sử dụng >>> import math as m >>> m.pi 3.141592653589793 >>> from math import pi as PI >>> PI 3.141592653589793 97vì điều đó sẽ tự động khởi tạo từng bộ nối tiếp. Với việc tái cấu trúc này, bộ tuần tự hoạt động giống như trước đó. Tuy nhiên, bạn có thể linh hoạt hơn trong việc đặt tên cho các lớp serializer của mình.

Để biết thêm thông tin về cách sử dụng plugin, hãy xem PyPlugs trên PyPI và Plugin: Thêm tính linh hoạt cho bản trình bày Ứng dụng của bạn từ PyCon 2019 .

Hệ thống nhập Python

Bạn đã thấy nhiều cách để tận dụng hệ thống nhập của Python. Trong phần này, bạn sẽ tìm hiểu thêm một chút về những gì xảy ra đằng sau khi các mô-đun và gói được nhập.

Như với hầu hết các phần của Python, hệ thống nhập có thể được tùy chỉnh. Bạn sẽ thấy một số cách mà bạn có thể thay đổi hệ thống nhập, bao gồm tự động tải xuống các gói bị thiếu từ PyPI và nhập tệp dữ liệu như thể chúng là mô-đun.

  1. Nhập nội bộ
  2. Chi tiết của hệ thống nhập 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ột mô-đun (hoặc gói). Mô-đun là:
  3. Tìm kiếm

Nạp vào

Bị ràng buộc với một không gian tê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'
7

Lưu ý rằng 

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

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

Bạn cũng có thể chọn một cách linh hoạt hơ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 thông tin người dùng nhập:

>>>

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

Lưu ý rằng 

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

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

Bộ đệm ẩn mô-đun đóng một vai trò rất quan trọng trong hệ thống nhập Python. Nơi đầu tiên Python tìm kiếm các mô-đun khi thực hiện nhập là ở trong 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
01. Nếu một mô-đun đã có sẵn, thì mô-đun đó sẽ không được tải lại.

Đây là một sự 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ể gặp phải sự mâu thuẫn trong một số trường hợp nhất định, chẳng hạn như khi mã nguồn cơ bản thay đổi trong khi tập lệnh đang chạy.

Nhớ lại đường dẫn nhập bạn đã thấy trước đó. Về cơ bản, nó cho Python biết nơi 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 ẩn của mô-đun, thì nó sẽ không bận tâm tìm kiếm đường dẫn nhập cho mô-đun.

Ví dụ: Singletons dưới dạng Mô-đun

Trong lập trình hướng đối tượng , một singleton là một lớp có nhiều nhất một thể hiện. Mặc dù có thể triển khai các singleton bằng Python , nhưng thay vào đó, hầu hết các ứng dụng tốt của các singleton có thể được xử lý bởi các mô-đun. Bạn có thể tin tưởng bộ đệm ẩn mô-đun để khởi tạo một lớp chỉ một lần.

Để làm ví dụ, hãy quay 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 định nghĩa một lớp bao bọc 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

Việc đọc dữ liệu từ đĩa mất một chút thời gian. Vì bạn không mong đợi tệp dữ liệu thay đổi, bạn khởi tạo lớp khi bạn tải mô-đun. Tên của lớp bắt đầu bằng dấu gạch dưới để cho người dùng biết rằng họ không nên sử dụng nó.

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

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
03singleton để tạo biểu đồ Matplotlib hiển thị dự báo dân số cho các quốc gia đông dân nhất:

>>>

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

Điều này tạo ra một biểu đồ như sau:

Hướng dẫn python from file import - python từ nhập tệp

Lưu ý rằng tải dữ liệu vào thời điểm nhập khẩu là một loại antipattern . Tốt nhất, bạn muốn hàng nhập khẩu của mình không có tác dụng phụ càng tốt. Một cách tiếp cận tốt hơn là tải dữ liệu một cách lười biếng khi bạn cần. Bạn có thể làm điều này một cách khá thanh lịch bằng cách sử dụng thuộc tính Mở rộng phần sau để xem ví dụ.

Đang tải lại các mô-đun

Bộ nhớ cache của mô-đun có thể hơi khó chịu khi bạn đang làm việc trong trình thông dịch tương tác. Việc tải lại một mô-đun sau khi bạn thay đổi nó không phải là chuyện nhỏ. Ví dụ: hãy xem mô-đun sau:

Là một phần của thử nghiệm và gỡ lỗi mô-đun này, bạn nhập nó vào bảng điều khiển Python:

>>>

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

Điều này tạo ra một biểu đồ như sau:

Lưu ý rằng tải dữ liệu vào thời điểm nhập khẩu là một loại antipattern . Tốt nhất, bạn muốn hàng nhập khẩu của mình không có tác dụng phụ càng tốt. Một cách tiếp cận tốt hơn là tải dữ liệu một cách lười biếng khi bạn cần. Bạn có thể làm điều này một cách khá thanh lịch bằng cách sử dụng thuộc tính Mở rộng phần sau để xem ví dụ.

>>>

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

Điều này tạo ra một biểu đồ như sau:

Lưu ý rằng tải dữ liệu vào thời điểm nhập khẩu là một loại antipattern . Tốt nhất, bạn muốn hàng nhập khẩu của mình không có tác dụng phụ càng tốt. Một cách tiếp cận tốt hơn là tải dữ liệu một cách lười biếng khi bạn cần. Bạn có thể làm điều này một cách khá thanh lịch bằng cách sử dụng thuộc tính Mở rộng phần sau để xem ví dụ.

>>>

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

Điều này tạo ra một biểu đồ như sau:

>>>

Điều này tạo ra một biểu đồ như sau:

Lưu ý rằng tải dữ liệu vào thời điểm nhập khẩu là một loại antipattern . Tốt nhất, bạn muốn hàng nhập khẩu của mình không có tác dụng phụ càng tốt. Một cách tiếp cận tốt hơn là tải dữ liệu một cách lười biếng khi bạn cần. Bạn có thể làm điều này một cách khá thanh lịch bằng cách sử dụng thuộc tính Mở rộng phần sau để xem ví dụ.

Đang tải lại các mô-đun

Bộ nhớ cache của mô-đun có thể hơi khó chịu khi bạn đang làm việc trong trình thông dịch tương tác. Việc tải lại một mô-đun sau khi bạn thay đổi nó không phải là chuyện nhỏ. Ví dụ: hãy xem mô-đun sau:

Là một phần của thử nghiệm và gỡ lỗi mô-đun này, bạn nhập nó vào bảng điều khiển Python:

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

Giả sử bạn nhận ra rằng bạn có lỗi trong mã của mình, vì vậy bạn cập nhật 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
04tệp trong trình chỉnh sửa của mình:

>>>

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

Điều này tạo ra một biểu đồ như 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

7

Bạn có thể thấy nó 

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

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40đượ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
14là một số loại mô-đun tích hợp sẵn. Có vẻ như các mô-đun tích hợp sẵn không bị che khuất bởi các mô-đun cục bộ.

Lưu ý: Các mô-đun tích hợp được biên dịch thành trình thông dịch Python. Thông thường, chúng module nền tảng như 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
18, 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
19, và 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
14. Mô-đun nào được tích hợp tùy thuộc vào trình thông dịch Python của bạn, nhưng bạn có thể tìm thấy tên của chúng trong đó 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
21.

Hãy tìm hiểu sâu hơn nữa về hệ thống nhập của Python. Điều này cũng sẽ cho thấy lý do tại sao các mô-đun tích hợp sẵn không bị che bởi các mô-đun cục bộ. Có một số bước liên quan khi nhập một mô-đun:

  1. Python kiểm tra xem mô-đun có sẵn trong bộ nhớ cache của mô-đun hay không . Nếu 

    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    01chứa tên của mô-đun, thì mô-đun đó đã có sẵn và quá trình nhập kết thúc.

  2. Python bắt đầu tìm kiếm mô-đun bằng cách sử dụng một số công cụ tìm kiếm . Một công cụ tìm kiếm sẽ tìm kiếm mô-đun bằng cách sử dụng một chiến lược nhất định. Công cụ tìm kiếm mặc định có thể nhập mô-đun tích hợp sẵn, mô-đun cố định và mô-đun trên đường dẫn nhập.

  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 kiếm định vị mô-đun và được chỉ định trong một thứ gọi là thông số mô-đun .

Bạn có thể mở rộng hệ thống nhập Python bằng cách triển khai công cụ tìm của riêng bạn và nếu cần, trình tải của riêng bạn. Bạn sẽ thấy một ví dụ hữu ích hơn về công cụ tìm 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.

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
23 kiểm soát công cụ tìm kiếm nào đượ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

Trước tiên, hãy lưu ý rằng điều này trả lời câu hỏi trước đó: các mô-đun tích hợp sẵn 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, công cụ này 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
23theo ý thích của mình.

Để nhanh chóng làm rối phiên Python của bạn, bạn có thể xóa tất cả các công cụ tìm 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ó công cụ tìm kiếm, Python không thể tìm 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ộ nhớ cache của mô-đun vì nó trông ở đó 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
54đã được tải dưới mui xe trước khi bạn xóa danh sách công cụ tìm kiếm. Nếu bạn thực sự muốn làm cho phiên Python của mình hoàn toàn không sử dụng được, thì bạn cũng có thể xóa bộ nhớ cache của mô-đun , 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
01.

Sau đây là một ví dụ hữu ích hơn một chút. Bạn sẽ viết một công cụ tìm để in một thông báo tới 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 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 trình tìm kiếm phải triển khai một 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
27phương thức lớp, phương thức này sẽ cố gắng tìm một mô-đun nhất định. Có ba cách 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
27có thể chấm dứt:

  1. Bằng cách quay lại
    world/
    │
    ├── africa/
    │   ├── __init__.py
    │   └── zimbabwe.py
    │
    ├── europe/
    │   ├── __init__.py
    │   ├── greece.py
    │   ├── norway.py
    │   └── spain.py
    │
    └── __init__.py
    
    29 nếu nó không biết cách tìm và tải mô-đun
  2. Bằng cách trả về một mô-đun chỉ định cách tải mô-đun
  3. Bằng cách tăng a
    >>> from math import pi
    >>> pi
    3.141592653589793
    
    >>> math.pi
    NameError: name 'math' is not defined
    
    74 để cho biết rằng không thể nhập mô-đun

Bản 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
31in một thông báo đến bảng điều khiển và sau đó trả về một cách rõ ràng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
29để chỉ ra rằng các công cụ tìm kiếm khác sẽ tìm ra cách thực sự nhập mô-đun.

Lưu ý: Vì Python trả về ngầm định

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
29 từ bất kỳ hàm hoặc phương thức nào mà không có hàm rõ ràng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
34, bạn có thể bỏ qua dòng 9 . Tuy nhiên, trong trường hợp này, tốt hơn là nên bao gồm 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
35để làm rõ rằng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
31không tìm thấy 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
31đầu tiên vào danh sách công cụ tìm kiếm, bạn sẽ nhận được danh sách đang 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
38sẽ kích hoạt việc nhập một số mô-đun khác 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
38phụ 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
40, cung cấp cùng một thông tin và nhiều hơn nữa.

Ví dụ khác, giả sử rằng bạn đang tìm cách loại bỏ thế giới của các biểu thức chính quy . (Bây giờ, tại sao bạn lại muốn một thứ như vậy? Biểu thức chính quy thật tuyệt vời !) Bạn có thể triển khai công cụ tìm kiếm sau để cấm 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
41mô-đun biểu thức chính quy :

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

Nâng cao một 

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

>>> math.pi
NameError: name 'math' is not defined
74đảm bảo rằng không có công cụ tìm kiếm nào sau này trong danh sách các công cụ tìm kiế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 chính quy 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ỉ đang nhập 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
38, nhưng mô-đun đó đang nhập 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
41ở hậu trường, do đó, lỗi sẽ xuất hiện.

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 rối tung nó hơn là mở rộng nó một cách hữu ích. Tuy nhiên, ví dụ sau đây có thể hữu ích trong một số trường hợp nhất định.

Các Python Package Index (PyPI) là một cửa của bạn cửa hàng phô mai cho việc tìm kiếm các module và các gói của bên thứ ba. Nó cũng là nơi 

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

>>> math.pi
NameError: name 'math' is not defined
46tải xuống các gói.

Trong các hướng dẫn Real Python khác , bạn có thể đã xem hướng dẫn sử dụng 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
46để cài đặt các gói và mô-đun của bên thứ ba mà bạn cần để làm theo cùng với các ví dụ. Sẽ không tuyệt vời nếu Python tự động cài đặt các mô-đun bị thiếu cho bạn phải không?

Cảnh báo: Trong hầu hết các trường hợp, thực sự sẽ không tuyệt vời nếu Python tự động cài đặt các mô-đun. Ví dụ: trong hầu hết các cài đặt sản xuất, bạn muốn kiểm soát môi trường của mình. Hơn nữa, tài liệu cảnh báo không sử dụng 

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

>>> math.pi
NameError: name 'math' is not defined
46theo cách này.

Để tránh làm xáo trộn quá trình cài đặt Python của bạn, bạn chỉ nên sử dụng mã này trong những môi trường mà bạn không ngại xóa hoặc cài đặt lại.

Công cụ tìm kiếm sau 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
46:

>>> # 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 các công cụ tìm bạn đã thấy trước đó, công cụ này phức tạp hơn một chút. Bằng cách đặt công cụ tìm kiếm này cuối cùng trong danh sách công cụ tìm kiếm, bạn 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
49, thì mô-đun sẽ không được tìm thấy trên hệ thống của bạn. Công việc của 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
27do đó chỉ là làm 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
51. Nếu quá trình cài đặt hoạt động, thì thông số mô-đun sẽ được tạo và trả về.

Cố gắng sử dụng 

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

>>>

>>> # 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
53sẽ tăng a 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
74, nhưng trong trường hợp 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
52này là cài đặt và nhập.

Mặc dù 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
49có vẻ hiệu quả, nhưng có một số thách thức với cách tiếp cận này. Một vấn đề chính là tên nhập của một mô-đun không phải lúc nào cũng tương ứng với tên của nó trên PyPI. Ví dụ: trình đọc nguồn cấp dữ liệu Python thực được gọi 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
57trên PyPI, nhưng tên nhập chỉ đơn giản là 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
58.

Sử dụng 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
49để nhập và cài đặt 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
58kết thúc bằng cách cài đặt gói sai:

>>>

>>> # 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ể gây ra hậu quả tai hại cho dự án của bạn.

Một tình huống trong đó cài đặt tự động có thể khá hữu ích là khi bạn đang chạy Python trên đám mây với quyền 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 đang chạy sổ ghi chép kiểu Jupyter tại Google Colaboratory . Môi trường máy tính xách tay Colab rất tuyệt vời để thực hiện khám phá dữ liệu hợp tác.

Một máy tính xách tay đ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
46. Nhưng bạn cũng có thể kích hoạt cài đặt tự động:

Hướng dẫn python from file import - python từ nhập tệp

Vì 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
62không khả dụng cục bộ trên máy chủ Colab, mã được sao chép vào ô đầu tiên của sổ ghi chép.

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 blog tuyệt vời của Aleksey Bilogur Nhập hầu hết mọi thứ bằng Python: Giới thiệu về Trình tải và Trình tìm mô-đun . Bạn đã thấy cách sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08để nhập tệp dữ liệu. Tại đây, thay vào đó, bạn sẽ triển khai trình tải tùy chỉnh có thể nhập trực tiếp tệp 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ụ về trình tải tùy chỉnh dễ quản lý hơn, hãy xem xét 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
64tệp 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à tiêu đề đặt tên cho ba trường và hai hàng dữ liệu sau, mỗi hàng chứa thông tin về một nhân viên. Để biết thêm thông tin về cách làm việc với tệp CSV, hãy xem Đọc và Viết tệp CSV bằng Python .

Mục tiêu của bạn trong phần này là viết một công cụ tìm và một trình tải cho phép bạn nhập 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 công cụ tìm kiếm sẽ là tìm kiếm và nhận dạng 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 các trình tìm kiếm và trình tải tương ứng trong một lớp chung. Đó là cách tiếp cận bạn sẽ thực hiện ở đây:

>>> # 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ô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
27và 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
66. Hãy xem xét chúng 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
27chịu trách nhiệm tìm kiếm mô-đun. Trong trường hợp này, bạn đang tìm kiếm tệp CSV, vì vậy bạn tạo tên tệp có 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
68hậu tố. 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
50chứ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
70, thì 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
50sẽ được 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
72. 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
64.

Đố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
74sẽ được 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
29. Trong trường hợp đó, bạn tìm kiếm tệp CSV trong đường dẫn nhập đầy đủ, đường dẫn này sẽ bao gồm thư mục làm việc hiện tại. Nếu bạn đang nhập tệp CSV trong một gói, thì tệp đó 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
74sẽ được đặt thành đường dẫn hoặc các đường dẫn của gói. Nếu bạn tìm thấy tệp CSV phù hợp, thì thông số mô-đun sẽ được trả về. Thông số mô-đun này yêu cầu Python tải mô-đun bằng cách sử dụng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
77.

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
66. Bạn có thể sử dụng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
79từ thư viện chuẩn để phân tích cú pháp tệp thực tế. Giống như hầu hết mọi thứ trong Python, các mô-đun được hỗ trợ bởi từ điển. Bằng cách thêm dữ liệu CSV vào 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
80, bạn làm cho nó có sẵn dưới dạng thuộc tính của mô-đun.

Ví dụ: thêm 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
81vào từ điển mô-đun trên dòng 44 cho phép bạn liệt kê tên trường trong tệp CSV như sau:

>>>

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
0

Nói chung, tên trường CSV có thể chứa khoảng trắng và các ký tự khác không được phép trong tên thuộc tính Python. Trước khi thêm các trường làm thuộc tính trên mô-đun, bạn làm sạch tên trường bằng biểu thức chính quy . Điều này được thực hiện khi 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
82bắt đầu từ dòng 51 .

Bạn có thể xem ví dụ về hiệu ứng này trong 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
83tên trường ở 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 đề 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
84có dấu cách thay vì dấu gạch dưới.

Bằng cách kết nối điều này 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
77vào hệ thống nhập Python, bạn sẽ có được một chút chức năng miễn phí. Ví dụ: bộ đệm ẩn mô-đun sẽ đảm bảo rằng tệp dữ liệu chỉ được tải một lần.

Mẹo và thủ thuật nhập khẩu

Để hoàn thiện hướng dẫn này, bạn sẽ thấy một vài mẹo về cách xử lý các tình huống nhất định thỉnh thoảng xuất hiện. Bạn sẽ thấy cách xử lý các gói bị thiếu, nhập theo chu kỳ và thậm chí các gói được lưu trữ bên trong tệp ZIP.

Xử lý các gói trên các phiên bản Python

Đôi khi bạn cần xử lý các gói có tên khác nhau tùy thuộc vào phiên bản Python. Bạn đã thấy một ví dụ về điều này: 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08chỉ có sẵn kể từ Python 3.7. Trong các phiên bản Python trước đó, 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
12thay 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ý điều 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
88:

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

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
89và không phải lo lắng về việc bạn đang sử dụng 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
08hoặc 
>>> import math as m
>>> m.pi
3.141592653589793

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

Thông thường, dễ nhất là sử dụng một 

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

>>> math.pi
NameError: name 'math' is not defined
44câu lệnh để 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:

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
2

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

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08trên Python 3.7 và mới hơn trong khi quay trở lại 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
12các phiên bản cũ hơn của Python. Xem 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
95dự án để có lời khuyên tốt và có thể kiểm chứng 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 gói thay thế

Trường hợp sử dụng sau có liên quan chặt chẽ với ví dụ trước. Giả sử có một gói tái thực hiện tương thích. Việc thực hiện lại đượ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ễ có sẵn hơn và cũng mang lại hiệu suất chấp nhận được.

Một ví dụ như vậy là 

world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
96, đó là phiên bản được tối ưu hóa 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
97từ thư viện chuẩn. Bạn có thể xử lý các tùy chọn này giống như cách bạn xử lý các tên gói khác nhau trước đó:

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
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
96nếu nó có sẵn và rơi trở lại 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
97nếu không.

Một ví dụ tương tự khác là gói UltraJSON , một bộ mã hóa và giải mã JSON cực nhanh có thể được sử dụng để thay thế 

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

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

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
4

Bằng cách đổi 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
01thành 
>>> from math import pi
>>> pi
3.141592653589793

>>> math.pi
NameError: name 'math' is not defined
87, bạn không phải lo lắng về gói nào đã thực sự được nhập.

Xử lý các gói bị thiếu: Sử dụng Mock để thay thế

Ví dụ thứ ba, có liên quan là thêm một gói cung cấp một tính năng tuyệt vời không 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
44vào các mục nhập của bạn. Thách thức bổ sung là bạn sẽ thay thế gói tùy chọn như thế nào nếu nó không có sẵn.

Ví dụ cụ thể, giả sử rằng bạn đang sử dụng Colorama để thêm văn bản màu trong bảng điều khiển. Colorama chủ yếu bao gồm các hằng số chuỗi đặc biệt thêm màu khi in:

>>>

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
5

Thật không may, màu không hiển thị trong ví dụ trên. Trong thiết bị đầu cuối của bạn, nó sẽ trông giống như sau:

Hướng dẫn python from file import - python từ nhập tệp

Trước khi bắt đầu sử dụng màu Colorama, bạn nên gọi đ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
04. Đặ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
05thà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
06có nghĩa là các chỉ thị màu sẽ được tự động đặt lại ở cuối chuỗi. Đó là một cài đặt hữu ích nếu bạn chỉ muốn tô màu một dòng tại một thời điểm.

Nếu bạn muốn tất cả đầu ra của mình là (ví dụ) màu xanh lam, thì bạn có 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
05là 
# 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
08và thê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
09vào đầu tập lệnh của mình. Các màu sau có sẵn:

>>>

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
6

Thật không may, màu không hiển thị trong ví dụ trên. Trong thiết bị đầu cuối của bạn, nó sẽ trông giống như sau:

Trước khi bắt đầu sử dụng màu Colorama, bạn nên gọi đ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
04. Đặ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
05thà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
06có nghĩa là các chỉ thị màu sẽ được tự động đặt lại ở cuối chuỗi. Đó là một cài đặt hữu ích nếu bạn chỉ muốn tô màu một dòng tại một thời điểm.

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
7

Nếu bạn muốn tất cả đầu ra của mình là (ví dụ) màu xanh lam, thì bạn có 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
05là 
# 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
08và thê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
09vào đầu tập lệnh của mình. Các màu sau có sẵn:

Bạn cũng có thể 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
10để kiểm soát kiểu văn bản của mình. Bạn có thể lựa chọn giữ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
11, 
# 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
12và 
# 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
13.

Cuối cù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
14cung cấp mã để kiểm soát vị trí của con trỏ. Bạn có thể sử dụng nó để hiển thị tiến trình hoặc trạng thái của một 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
15:

>>>

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
8

Thật không may, màu không hiển thị trong ví dụ trên. Trong thiết bị đầu cuối của bạn, nó sẽ trông giống như sau:

Trước khi bắt đầu sử dụng màu Colorama, bạn nên gọi đ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
04. Đặ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
05thà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
06có nghĩa là các chỉ thị màu sẽ được tự động đặt lại ở cuối chuỗi. Đó là một cài đặt hữu ích nếu bạn chỉ muốn tô màu một dòng tại một thời điểm.

>>> import math
>>> math.__dict__["pi"]
3.141592653589793
9

Nếu bạn muốn tất cả đầu ra của mình là (ví dụ) màu xanh lam, thì bạn có 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
05là 
# 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
08và thê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
09vào đầu tập lệnh của mình. Các màu sau có sẵn:

Bạn cũng có thể 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
10để kiểm soát kiểu văn bản của mình. Bạn có thể lựa chọn giữ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
11, 
# 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
12và 
# 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
13.

Cuối cù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
14cung cấp mã để kiểm soát vị trí của con trỏ. Bạn có thể sử dụng nó để hiển thị tiến trình hoặc trạng thái của một 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
15:

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

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

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ãy quay trở lại nhiệm vụ trong tầm 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 điều tuyệt vời nhưng không quá quan trọng. Để tránh thêm phụ thuộc khác vào ứng dụng của mình, bạn chỉ muốn sử dụng Colorama nếu nó có sẵn trên hệ thống và không phá vỡ ứng dụng nếu không có.

Để làm điều này, bạn có thể lấy cảm hứng từ thử nghiệm và việc sử dụng mô phỏng . Một mô hình có thể thay thế cho một đối tượng khác trong khi vẫn cho phép bạn kiểm soát hành vi của nó. Đây là một nỗ lực ngây thơ nhằm chế nhạo Colorama:

Điều này không hoàn toàn hiệu quả, 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
16được biểu diễn bằng một chuỗi làm rối đầu ra của bạn. Thay vào đó, bạn muốn tạo một đối tượng luôn hiển thị dưới dạng chuỗi trống.

Có thể thay đổi giá trị trả lại 

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

>>> math.pi
NameError: name 'math' is not defined
68trê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
18các đối tượng. Tuy nhiên, trong trường hợp này, sẽ thuận tiện hơn khi viết mô hình 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
19là một chuỗi trống cũng sẽ trả về chuỗi trống khi nó được gọi. Điều này giúp chúng ta tái hiện lại Colorama một cách hiệu quả, chỉ cần không có màu sắc.

Bí quyế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
20lợi nhuận riêng của mình, do đó tất cả các phong trào màu sắc, phong cách, và con trỏ đó là các 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
21, 
# 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, 
# 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
23, 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
24đang chế giễu là tốt.

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

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

Cá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
25mô-đun được thiết kế để trở thành một thả thay thế cho Colorama, vì vậy bạn có thể cập nhật ví dụ đếm ngược sử dụng tìm kiếm và thay thế:

Nếu bạn chạy tập lệnh này trên một hệ thống không có sẵn Colorama, thì nó vẫn hoạt động, nhưng có thể trông không đẹp:

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

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

Giờ đây, cấu trúc của tệp JSON trở nên ít phức tạp hơn nhiều để nắm bắt. Bạn có thể 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
32tùy chọn để sắp xếp các khóa theo thứ tự bảng chữ cái.

Mặc dù thực hành tốt để phân chia tập lệnh và thư viện, Python có một thành ngữ giúp bạn có thể coi một mô-đun vừa là tập lệnh vừa là thư viện cùng một lúc. Như đã lưu ý trước đó , giá trị của 

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

>>> math.pi
NameError: name 'math' is not defined
16biến mô-đun đặc biệt được đặt trong thời gian chạy dựa trên việc mô-đun được nhập hay chạy dưới dạng tập lệ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 tệp đó 

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

>>> math.pi
NameError: name 'math' is not defined
16được đặt thành giá trị đặc biệt 
>>> from math import pi
>>> pi
3.141592653589793

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

>>> 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
16được đặt thành tên của mô-đun:

Hành vi này được tận dụng theo 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 sẽ thay thế bất kỳ độ tuổi “già” nà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
37hoặc cao hơn) bằng 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
05:

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

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

Bạn có thể chạy tập lệnh này dưới dạng tập lệnh và nó sẽ tương tác làm cho độ tuổi bạn nhập trẻ hơn:

>>> 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. Bài 

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

>>> math.pi
NameError: name 'math' is not defined
15kiểm tra 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 chức nă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
40và 
# 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
41được xác định. Ví dụ, bạn có thể sử dụng thư viện này như sau:

>>>

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

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

Nếu không có sự bảo vệ của 

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

>>> math.pi
NameError: name 'math' is not defined
15bài kiểm tra, việc nhập sẽ kích hoạt tương tá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
43và 
# 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
44rất khó sử dụng làm thư viện.

Chạy tập lệnh Python từ tệp ZIP

Một tính năng hơi khó hiểu của Python là nó có thể chạy các tập lệnh được đóng gói thành các tệp ZIP . Ưu điểm chính của việc này là bạn có thể phân phối một gói đầy đủ dưới dạng một tệp duy nhất.

Tuy nhiên, lưu ý rằng điều này vẫn yêu cầu Python phải đượ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, hãy xem Sử dụng PyInstaller để dễ dàng phân phối ứ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 kiế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
40bên trong kho lưu trữ ZIP, giải nén nó và chạy nó. Như một ví dụ cơ bản, hãy tạo 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40tệp sau :

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

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

Điều này sẽ in một thông báo khi bạn chạy nó:

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

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

Bây giờ hãy thêm nó vào kho lưu trữ ZIP. Bạn có thể thực hiện việc 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 trỏ và nhấp . Chọn tệp trong File Explorer, sau đó nhấp chuột phải và chọn Gửi đến → Thư mục nén (nén) .

Vì 

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

>>> math.pi
NameError: name 'math' is not defined
17không phải là một cái tên mang tính mô tả nên 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
48. Bây giờ bạn có thể gọi nó trực tiếp bằng Python:

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

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

Lưu ý rằng tập lệnh của bạn biết rằng nó nằm 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
48. Hơn nữa, gốc của tệp ZIP của bạn được thêm vào đường dẫn nhập của Python để 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 nhớ 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ố . 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. 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08sẽ đảm bảo tệp dữ liệu được trích xuất từ ​​kho lưu trữ ZIP khi cần thiết.

Ứ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 tệp ZIP theo cách tương tự như bạn đã làm ở trên. Tuy nhiên, Python đi kèm với một công cụ đượ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
51hợp lý hóa quá trình đóng gói các ứng dụng vào các 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

Về cơ bản, lệnh này thực hiện hai việc: nó tạo một điểm vào và đóng gói ứng dụng của bạn.

Hãy nhớ rằng bạn cần một 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
40tệp làm điểm nhập bên trong kho lưu trữ ZIP của mình. Nếu bạn cung cấp 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
43tùy chọn với thông tin về cách khởi động ứng dụng của bạn, thì hãy 
# 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
51tạo tệp này cho bạn. Trong ví dụ này, tệp được tạo 
>>> import math as m
>>> m.pi
3.141592653589793

>>> from math import pi as PI
>>> PI
3.141592653589793
40trông giống như sau:

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

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

Điều này 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
40được đóng gói, cùng với nội dung 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
57thư mục, 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
58. Cá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
59tín hiệu hậu tố rằng đây là một tập tin Python quấn vào một kho lưu trữ ZIP.

Lưu ý: Theo mặc đị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
51không nén bất kỳ tệp nào. Nó chỉ gói chúng thành một tệp duy nhất. Bạn cũng có thể yê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
51cầu nén các tệp bằng cách thê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
62tùy chọn.

Tuy nhiên, tính năng này chỉ có sẵn trong Python 3.7 trở lên. Xem 

# 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 tài liệu để biết thêm thông tin.

Trên Windows, 

# 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
59các tệp đã được đăng ký dưới dạng tệp Python. Trên Mac và Linux, bạn có 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
51tạo các tệp thực thi bằng cách 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
66tùy chọn trình thông dịch 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

Cá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
66tùy chọn bổ sung thêm một công việ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) mà nói với các hệ điều hành như thế nào để chạy các tập tin . Ngoài ra, nó làm cho 
# 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
59tệp thực thi được để bạn có thể chạy tệp chỉ bằng cách nhập tên của nó:

>>> 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
70phía 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 các tập tin vào một thư mục trên của 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
71, hoặc nếu bạn đang sử dụng Windows, sau đó bạn sẽ có thể chỉ sử dụng tên tập tin: 
# 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 ý: Trên Python 3.6 trở lên, lệnh trước đó sẽ không thành công với thông báo rằng nó không thể tìm thấy tài nguyên dữ liệu dân số trong 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
28thư mục. Điều này là do một giới hạ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
74 .

Một cách giải quyết là cung cấp đường dẫn tuyệt đố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
58. Trên Mac và Linux, bạn có thể thực hiện việc này bằng thủ thuật sau:

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

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

Cá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
76lệnh mở rộng đến đường dẫn của thư mục hiện hành.

Hãy kết thúc phần này bằng cách xem một hiệu ứng đẹp của việc sử dụng 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
08. 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', ...]
19

Một cách phổ biến hơn để mở tệp dữ liệu là định vị chúng dựa trên 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
04thuộc tính của mô-đun của bạn :

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

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

Cách tiếp cận này thường hoạt động tốt. Tuy nhiên, nó sẽ sụp đổ khi ứng dụng của bạn được đóng gói thành một tệp ZIP:

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

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

Tệp dữ liệu của bạn nằm trong kho lưu trữ ZIP, vì vậy bạn 

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

>>> from math import pi as PI
>>> PI
3.141592653589793
21không thể mở tệp đó. 
>>> import math as m
>>> m.pi
3.141592653589793

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

Nhập theo chu kỳ xảy ra khi bạn có hai hoặc nhiều mô-đun nhập lẫn nhau. Cụ thể hơn, hãy tưởng tượng rằng mô-đun 

# 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
81sử 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
82và 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
83nhậ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
81.

Hướng dẫn python from file import - python từ nhập tệp

Hệ thống nhập của Python ở một mức độ nào đó được thiết kế để xử lý các chu trình nhập. Ví dụ, đoạn mã sau — mặc dù không hữu ích lắm — chạy tốt:

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

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

Cố gắng nhập cũng 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
81nhập thông dịch viên tương tá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
83:

>>>

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

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

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
83được nhập vào giữa quá trình 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
81, chính xác tạ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
82câu lệnh 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
81. 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 ta là bộ nhớ cache của 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
91, tham chiếu tớ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
81sẽ được thêm vào bộ đệm ẩn của 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
81đượ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
83cố 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
81sau, nó chỉ cần sử dụng tham chiếu trong bộ đệm ẩn mô-đun.

Bạn cũng có thể có các mô-đun làm điều gì đó hữu ích hơn một chút. Nếu bạn xác định các thuộc tính và chức năng trong các mô-đun của mình, thì tất cả vẫn hoạt động:

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

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

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
81hoạt động giống như trước đây:

>>>

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

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

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
83được nhập vào giữa quá trình 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
81, chính xác tạ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
82câu lệnh 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
81. 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 ta là bộ nhớ cache của mô-đun.

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

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

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
91, tham chiếu tớ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
81sẽ được thêm vào bộ đệm ẩn của 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
81đượ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
83cố 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
81sau, nó chỉ cần sử dụng tham chiếu trong bộ đệm ẩn mô-đun.

>>>

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

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

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
83được nhập vào giữa quá trình 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
81, chính xác tạ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
82câu lệnh 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
81. 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 ta là bộ nhớ cache của 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
91, tham chiếu tớ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
81sẽ được thêm vào bộ đệm ẩn của 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
81đượ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
83cố 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
81sau, nó chỉ cần sử dụng tham chiếu trong bộ đệm ẩn mô-đun.

Bạn cũng có thể có các mô-đun làm điều gì đó hữu ích hơn một chút. Nếu bạn xác định các thuộc tính và chức năng trong các mô-đun của mình, thì tất cả vẫn hoạt động:

>>>

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

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

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
83được nhập vào giữa quá trình 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
81, chính xác tạ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
82câu lệnh 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
81. 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 ta là bộ nhớ cache của mô-đun.

>>>

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

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

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
83được nhập vào giữa quá trình 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
81, chính xác tạ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
82câu lệnh 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
81. 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 ta là bộ nhớ cache của mô-đun.

Thông thường, thời điểm dễ dàng nhất để sửa lỗi nhập theo chu kỳ là trước khi bạn triển khai chúng. Nếu bạn thấy các chu kỳ trong bản phác thảo kiến ​​trúc của mình, hãy xem kỹ hơn và cố gắng phá vỡ các chu kỳ .

Tuy nhiên, có những thời điểm 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, hàm, lớp, v.v. Mẹo thứ hai — cũng là một phương pháp thiết kế tốt — là giữ cho các mô-đun của bạn không có tác dụng phụ tại thời điểm nhập .

Nếu bạn thực sự cần các mô-đun có chu kỳ nhập và các tác dụng phụ, vẫn còn một cách khác: thực hiện nhập cục bộ bên trong các chức năng của bạn .

Lưu ý rằng trong đoạn 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
82được thực hiện bên trong 
>>> 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. Điều này có hai hệ 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
83chỉ có sẵn bên trong 
>>> 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'
04chức năng. Quan trọng hơn, quá trình nhập sẽ không xảy ra cho đến khi bạn 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'
04sau 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
81đã được nhập đầy đủ:

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

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

Bây giờ không có vấn đề gì khi nhập 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
81:

>>>

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

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

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
83, trên thực tế, không được nhập cho đến khi bạn 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'
04. Để có góc nhìn khác về nhập khẩu theo chu kỳ, hãy xem ghi chú kinh điển của Fredrik Lundh .

Nhập hồ sơ

Một mối quan tâm khi nhập một số mô-đun và gói là nó sẽ thêm vào thời gian khởi động tập lệnh của bạn. Tùy thuộc vào ứng dụng của bạn, điều này có thể quan trọng hoặc không.

Kể từ khi phát hành Python 3.7 , bạn đã có một cách nhanh chóng để biết cần bao nhiêu thời gian để nhập các gói và mô-đun. Python 3.7 hỗ trợ 

>>> 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'
20tùy chọn dòng lệnh, đo lường và in lượng thời gian mà mỗi mô-đun cần để nhập:

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

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

Cá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'
21cột cho thấy thời gian tích lũy của nhập khẩu (trong micro) trên một cơ sở cho mỗi gói. Bạn có thể đọc danh sách như sau: Python dành 
>>> 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'
22micro để hoàn toàn 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'
23, trong đó liên quan đến nhập khẩu 
world/
│
├── africa/
│   ├── __init__.py
│   └── zimbabwe.py
│
├── europe/
│   ├── __init__.py
│   ├── greece.py
│   ├── norway.py
│   └── spain.py
│
└── __init__.py
14, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40và việc thực hiện 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'
26là tốt.

Cá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'
27chương trình cột thời gian nó đã nhập khẩu chỉ module nhất định, bao gồm bất kỳ nhập khẩu đệ quy. 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
14mấ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'
29micro giây để nhập, 
>>> import math
>>> dir()
['__annotations__', '__builtins__', ..., 'math']

>>> dir(math)
['__doc__', ..., 'nan', 'pi', 'pow', ...]
40lấ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'
31, 
>>> 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'
26lấ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'
33và quá trình nhập 
>>> 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'
23chính nó 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'
35micro giây. Nói chung, điều này cộng lại thời gian tích lũy là 
>>> 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'
22micro giây (trong phạm vi sai số làm tròn).

Hãy xem 

>>> 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'
37ví dụ từ phần Colorama :

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

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

Trong ví dụ này, quá trình 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
25mất gần 0,013 giây. Phần lớn thời gian đó được dành cho việc nhập khẩu Colorama và các phụ thuộc của nó. Cá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'
27cột cho thấy thời gian nhập khẩu trừ nhập khẩu lồng nhau.

Đối với một ví dụ cực đoan, hãy xem xé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'
40singleton trước đó . Vì nó đang tải một tệp dữ liệu lớn nên quá trình nhập cực kỳ chậm. Để kiểm tra điều này, bạn có thể chạ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'
41dưới dạng tập lệnh 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
62tùy chọn:

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

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

Trong trường hợp này, mất gần 2 giây để nhập 

>>> 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'
40, trong đó khoảng 1,6 giây được dành cho chính mô-đun, chủ yếu để tải tệp dữ liệ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'
20là một công cụ tuyệt vời để tối ưu hóa việc nhập của bạn. Nếu bạn cần thực hiện giám sát tổng quát hơn và tối ưu hóa mã của mình, thì hãy xem Chức năng hẹn giờ của Python: Ba cách để theo dõi mã của bạn .

Phần kết luận

Trong hướng dẫn này, bạn đã biết về hệ thống nhập Python. Giống như nhiều thứ trong Python, nó khá đơn giản để sử dụng cho các tác vụ cơ bản như nhập các mô-đun và gói. Đồng thời, hệ thống nhập khẩu khá phức tạp, linh hoạt và có thể mở rộng. Bạn đã học được một số thủ thuật liên quan đến nhập mà bạn có thể tận dụng trong mã của riêng mình.

Trong hướng dẫn này, bạn đã học cách:

  • Tạo gói không gian tên
  • Nhập tài nguyên và tệp dữ liệu
  • Quyết định những gì sẽ nhập động trong thời gian chạy
  • Mở rộng hệ thống nhập của Python
  • Xử lý các phiên bản khác nhau của gói

Trong suốt hướng dẫn, bạn đã thấy nhiều liên kết để cung cấp 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
  • các 
    >>> import math as m
    >>> m.pi
    3.141592653589793
    
    >>> from math import pi as PI
    >>> PI
    3.141592653589793
    
    54gói
  • PEP 420: Gói không gian tên ngầm định
  • Nhập mô-đun

Bạn có thể sử dụng kiến ​​thức của mình về nhập Python bằng cách làm theo các ví dụ trong hướng dẫn này. Nhấp vào liên kết bên dưới để truy cập vào mã nguồn:

Hướng dẫn python from file import - python từ nhập tệp

Các khóa học qua video:
Lập trình C Java C# SQL Server PHP HTML5-CSS3-JavaScript
« Prev: Python: Các kiểu dữ liệu cơ bản trong Python Prev: Python: Các kiểu dữ liệu cơ bản trong Python
» Next: Python: Bố cục PyQt: Tạo các ứng dụng GUI chuyên nghiệp Next: Python: Bố cục PyQt: Tạo các ứng dụng GUI chuyên nghiệp