Nếu bạn đã từng làm việc trên một dự án Python có nhiều tệp, rất có thể bạn đã phải sử dụng câu lệnh nhập trước đây
Ngay cả đối với Pythonistas với một vài dự án trong vành đai của họ, việc nhập khẩu có thể gây nhầm lẫn. Có thể bạn đang đọc bài này vì bạn muốn hiểu sâu hơn về nhập khẩu trong Python, đặc biệt là nhập khẩu tuyệt đối và tương đối
Trong hướng dẫn này, bạn sẽ tìm hiểu sự khác biệt giữa hai loại này, cũng như ưu và nhược điểm của chúng. Hãy đi sâu vào ngay
Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới
Tóm tắt nhanh về nhập khẩu
Bạn cần hiểu rõ về các mô-đun và gói Python để biết cách nhập hoạt động. Mô-đun Python là một tệp có phần mở rộng
import abc
3 và gói Python là bất kỳ thư mục nào có các mô-đun bên trong nó [hoặc, trong Python 2, một thư mục chứa tệp import abc
4]Điều gì xảy ra khi bạn có mã trong một mô-đun cần truy cập mã trong mô-đun hoặc gói khác?
Loại bỏ các quảng cáoNhập khẩu hoạt động như thế nào
Nhưng chính xác thì nhập khẩu hoạt động như thế nào?
import abc
Điều đầu tiên Python sẽ làm là tra cứu tên
import abc
5 trong. Đây là bộ đệm của tất cả các mô-đun đã được nhập trước đóNếu tên không được tìm thấy trong bộ đệm mô-đun, Python sẽ tiến hành tìm kiếm thông qua danh sách các mô-đun tích hợp. Đây là những mô-đun được cài đặt sẵn với Python và có thể tìm thấy trong Thư viện chuẩn Python. Nếu tên vẫn không được tìm thấy trong các mô-đun tích hợp, thì Python sẽ tìm kiếm nó trong danh sách các thư mục được xác định bởi. Danh sách này thường bao gồm thư mục hiện tại, được tìm kiếm đầu tiên
Khi Python tìm thấy mô-đun, nó sẽ liên kết nó với một tên trong phạm vi cục bộ. Điều này có nghĩa là
import abc
5 hiện đã được xác định và có thể được sử dụng trong tệp hiện tại mà không cần ném from abc import xyz
0Nếu tên không bao giờ được tìm thấy, bạn sẽ nhận được một
from abc import xyz
1. Bạn có thể tìm hiểu thêm về nhập trong tài liệu Python tại đâyGhi chú. Mối quan tâm về an ninh
Xin lưu ý rằng hệ thống nhập của Python có một số rủi ro bảo mật đáng kể. Điều này phần lớn là do tính linh hoạt của nó. Ví dụ: bộ đệm mô-đun có thể ghi được và có thể ghi đè chức năng Python cốt lõi bằng hệ thống nhập. Việc nhập từ các gói của bên thứ ba cũng có thể khiến ứng dụng của bạn gặp phải các mối đe dọa bảo mật
Dưới đây là một số tài nguyên thú vị để tìm hiểu thêm về những lo ngại về bảo mật này và cách giảm thiểu chúng
- 10 vấn đề bảo mật phổ biến trong Python và cách tránh chúng bởi Anthony Shaw [Điểm 5 nói về hệ thống nhập của Python. ]
- Tập #168. 10 lỗ hổng bảo mật Python và cách khắc phục chúng từ podcast TalkPython [Các thành viên tham gia hội thảo bắt đầu nói về việc nhập khẩu vào khoảng ngày 27. 15 điểm. ]
Cú pháp báo cáo nhập khẩu
Bây giờ bạn đã biết cách hoạt động của câu lệnh nhập, hãy khám phá cú pháp của chúng. Bạn có thể nhập cả gói và mô-đun. [Lưu ý rằng việc nhập gói về cơ bản sẽ nhập tệp
import abc
4 của gói dưới dạng mô-đun. ] Bạn cũng có thể nhập các đối tượng cụ thể từ gói hoặc mô-đunNói chung có hai loại cú pháp nhập khẩu. Khi bạn sử dụng cái đầu tiên, bạn nhập tài nguyên trực tiếp, như thế này
import abc
import abc
5 có thể là một gói hoặc một mô-đunKhi bạn sử dụng cú pháp thứ hai, bạn nhập tài nguyên từ gói hoặc mô-đun khác. Đây là một ví dụ
from abc import xyz
from abc import xyz
4 có thể là một mô-đun, gói con hoặc đối tượng, chẳng hạn như một lớp hoặc hàmBạn cũng có thể chọn đổi tên tài nguyên đã nhập, như vậy
import abc as other_name
Điều này đổi tên tài nguyên đã nhập
import abc
5 thành from abc import xyz
6 trong tập lệnh. Bây giờ nó phải được tham chiếu là from abc import xyz
6, nếu không nó sẽ không được công nhậnKiểu dáng của báo cáo nhập khẩu
, hướng dẫn phong cách chính thức cho Python, có một số gợi ý khi viết câu lệnh nhập. Đây là một bản tóm tắt
Nội dung nhập phải luôn được ghi ở đầu tệp, sau bất kỳ nhận xét và mô-đun nào.
Nhập khẩu nên được chia theo những gì đang được nhập khẩu. Nhìn chung có ba nhóm
- nhập thư viện tiêu chuẩn [các mô-đun tích hợp sẵn của Python]
- nhập khẩu của bên thứ ba có liên quan [các mô-đun được cài đặt và không thuộc về ứng dụng hiện tại]
- nhập ứng dụng cục bộ [các mô-đun thuộc về ứng dụng hiện tại]
Mỗi nhóm nhập khẩu phải được phân tách bằng khoảng trống
Bạn cũng nên sắp xếp hàng nhập của mình theo thứ tự bảng chữ cái trong mỗi nhóm nhập. Điều này làm cho việc tìm kiếm các mục nhập cụ thể dễ dàng hơn nhiều, đặc biệt là khi có nhiều mục nhập trong một tệp
Đây là một ví dụ về cách định kiểu câu lệnh nhập
"""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
Các câu lệnh nhập ở trên được chia thành ba nhóm riêng biệt, được phân tách bằng khoảng trống. Chúng cũng được sắp xếp theo thứ tự bảng chữ cái trong mỗi nhóm
Loại bỏ các quảng cáonhập khẩu tuyệt đối
Bạn đã bắt kịp tốc độ viết câu lệnh nhập và cách tạo kiểu cho chúng như một người chuyên nghiệp. Bây giờ là lúc để tìm hiểu thêm một chút về nhập khẩu tuyệt đối
Nhập tuyệt đối chỉ định tài nguyên sẽ được nhập bằng đường dẫn đầy đủ của nó từ thư mục gốc của dự án
Cú pháp và ví dụ thực tế
Giả sử bạn có cấu trúc thư mục sau
└── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
Có một thư mục,
from abc import xyz
8, chứa hai thư mục con, from abc import xyz
9 và import abc as other_name
0. Thư mục from abc import xyz
9 có hai tệp, import abc as other_name
2 và import abc as other_name
3Thư mục
import abc as other_name
0 có ba tệp. hai mô-đun, import abc as other_name
5 và import abc as other_name
6, và một tệp khởi tạo, import abc
4. Nó cũng chứa một thư mục, import abc as other_name
8, đến lượt thư mục này lại chứa một tệp, import abc as other_name
9Hãy giả sử như sau
0 chứa hàm,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
1"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
2 chứa một lớp,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
3"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
4 chứa hàm,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
5"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
Sau đây là những ví dụ thực tế về nhập khẩu tuyệt đối
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
Lưu ý rằng bạn phải cung cấp đường dẫn chi tiết cho từng gói hoặc tệp, từ thư mục gói cấp cao nhất. Điều này hơi giống với đường dẫn tệp của nó, nhưng chúng tôi sử dụng dấu chấm [
"""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
6] thay vì dấu gạch chéo ["""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
7]Ưu và nhược điểm của nhập khẩu tuyệt đối
Nhập khẩu tuyệt đối được ưa thích hơn vì chúng khá rõ ràng và đơn giản. Thật dễ dàng để biết chính xác tài nguyên đã nhập ở đâu, chỉ bằng cách nhìn vào câu lệnh. Ngoài ra, nhập tuyệt đối vẫn hợp lệ ngay cả khi vị trí hiện tại của câu lệnh nhập thay đổi. Trên thực tế, PEP 8 khuyến nghị rõ ràng việc nhập khẩu tuyệt đối
Tuy nhiên, đôi khi, việc nhập tuyệt đối có thể khá dài dòng, tùy thuộc vào độ phức tạp của cấu trúc thư mục. Hãy tưởng tượng có một tuyên bố như thế này
from package1.subpackage2.subpackage3.subpackage4.module5 import function6
Điều đó thật lố bịch, phải không?
Nhập khẩu tương đối
Nhập tương đối chỉ định tài nguyên được nhập tương ứng với vị trí hiện tại—nghĩa là vị trí có câu lệnh nhập. Có hai loại nhập khẩu tương đối. ngầm định và rõ ràng. Nhập ẩn tương đối không được dùng trong Python 3, vì vậy tôi sẽ không đề cập đến chúng ở đây
Loại bỏ các quảng cáoCú pháp và ví dụ thực tế
Cú pháp của một lần nhập tương đối phụ thuộc vào vị trí hiện tại cũng như vị trí của mô-đun, gói hoặc đối tượng được nhập. Dưới đây là một vài ví dụ về nhập khẩu tương đối
from .some_module import some_class
from ..some_package import some_function
from . import some_class
Bạn có thể thấy rằng có ít nhất một dấu chấm trong mỗi câu lệnh nhập ở trên. Nhập khẩu tương đối sử dụng ký hiệu dấu chấm để chỉ định vị trí
Một dấu chấm đơn có nghĩa là mô-đun hoặc gói được tham chiếu nằm trong cùng thư mục với vị trí hiện tại. Hai dấu chấm có nghĩa là nó nằm trong thư mục mẹ của vị trí hiện tại—tức là thư mục ở trên. Ba dấu chấm có nghĩa là nó nằm trong thư mục ông bà, v.v. Điều này có thể sẽ quen thuộc với bạn nếu bạn sử dụng hệ điều hành giống Unix
Giả sử bạn có cùng cấu trúc thư mục như trước
└── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
Nhớ lại nội dung tập tin
0 chứa hàm,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
1"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
2 chứa một lớp,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
3"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
4 chứa hàm,"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
5"""Illustration of good import statement styling. Note that the imports come after the docstring. """ # Standard library imports import datetime import os # Third party imports from flask import Flask from flask_restful import Api from flask_sqlalchemy import SQLAlchemy # Local application imports from local_module import local_class from local_package import local_function
Bạn có thể nhập
"""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
1 vào tệp └── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
5 theo cách nàyimport abc
0Bạn chỉ sử dụng một dấu chấm ở đây vì
import abc as other_name
3 nằm trong cùng thư mục với mô-đun hiện tại, đó là import abc as other_name
2Bạn có thể nhập
"""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
3 và """Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
5 vào tệp from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
0 theo cách nàyimport abc
1Trong câu lệnh nhập đầu tiên, dấu chấm đơn có nghĩa là bạn đang nhập
"""Illustration of good import statement styling.
Note that the imports come after the docstring.
"""
# Standard library imports
import datetime
import os
# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
# Local application imports
from local_module import local_class
from local_package import local_function
3 từ gói hiện tại. Hãy nhớ rằng việc nhập gói về cơ bản sẽ nhập tệp import abc
4 của gói dưới dạng mô-đunTrong câu lệnh nhập thứ hai, bạn sẽ sử dụng lại một dấu chấm vì
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
3 nằm trong cùng thư mục với mô-đun hiện tại, đó là import abc as other_name
5Ưu và nhược điểm của nhập khẩu tương đối
Một lợi thế rõ ràng của nhập khẩu tương đối là chúng khá ngắn gọn. Tùy thuộc vào vị trí hiện tại, họ có thể biến câu lệnh nhập dài lố bịch mà bạn đã thấy trước đó thành một thứ đơn giản như thế này
import abc
2Thật không may, quá trình nhập tương đối có thể lộn xộn, đặc biệt đối với các dự án được chia sẻ khi cấu trúc thư mục có thể thay đổi. Các lần nhập tương đối cũng không thể đọc được như các lần nhập tuyệt đối và không dễ để biết vị trí của các tài nguyên đã nhập
Loại bỏ các quảng cáoPhần kết luận
Bạn đã hoàn thành tốt khóa học cấp tốc về nhập tuyệt đối và tương đối này. Bây giờ, bạn đã bắt kịp tốc độ hoạt động của tính năng nhập. Bạn đã học các phương pháp hay nhất để viết câu lệnh nhập và bạn biết sự khác biệt giữa nhập tuyệt đối và nhập tương đối
Với các kỹ năng mới của mình, bạn có thể tự tin nhập các gói và mô-đun từ thư viện chuẩn Python, gói của bên thứ ba và gói cục bộ của riêng bạn. Hãy nhớ rằng bạn thường nên chọn nhập tuyệt đối thay vì nhập tương đối, trừ khi đường dẫn phức tạp và sẽ khiến câu lệnh quá dài
Cảm ơn vì đã đọc
Đánh dấu là đã hoàn thành
Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Nhập tuyệt đối và tương đối trong Python
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Giới thiệu về Mbithe Nzomo
Tôi là một kỹ sư phần mềm có kinh nghiệm, quan tâm đến trí tuệ nhân tạo và máy học. Tôi hiện đang là sinh viên sau đại học tại Đại học Manchester, theo học Khoa học Máy tính Nâng cao với chuyên ngành AI
» Tìm hiểu thêm về MbitheMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
Adriana
David
Joanna
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi