Python中的绝对和相对导入
在Python中import
的工作:
Python中的导入类似于 C/C++ 中的#include header_file
。 Python模块可以通过使用 import 导入文件/函数来访问另一个模块的代码。 import
语句是调用导入机制的最常见方式,但它不是唯一的方式。导入语句由import
关键字和模块名称组成。
import 语句涉及两个操作,它搜索模块并将搜索结果绑定到本地范围内的名称。导入模块时, Python会运行模块文件中的所有代码,并使其可用于导入器文件。
当一个模块被导入时,解释器首先在sys.modules
中搜索它,这是之前导入的所有模块的缓存。如果没有找到,那么它将在所有具有该名称的内置模块中搜索,如果找到,则解释器运行所有代码并使其可用于文件。如果未找到该模块,则它将在变量sys.path
给出的目录列表中搜索具有相同名称的文件。
sys.path
是一个变量,其中包含一个包含Python库、包和包含输入脚本的目录的路径列表。例如,导入了一个名为math
的模块,然后解释器在内置模块中搜索它,如果找不到,则在sys.path
给出的目录列表中搜索一个名为math.py
的文件。
# Python program importing
# math module
import math
print(math.pi)
输出:
3.141592653589793
导入语句的语法:
用户可以导入包和模块。 (请注意,导入包本质上是将包的__init__.py
文件作为模块导入。)用户还可以从包或模块中导入特定对象。
通常有两种类型的导入语法。使用第一个时,直接导入资源。
import gfg
gfg
可以是包或模块。
当用户使用第二种语法时,用户从另一个包或模块导入资源。
from gfg import geek
geek可以是模块、子包或对象,例如类或函数。导入语句的样式:
PEP8 是Python的官方风格指南,它有一套关于如何制定Python代码以最大限度地提高其可读性的规则。为了编写导入语句,需要遵循以下几点:
- 导入应该总是写在文件的顶部,就在任何模块注释和文档字符串之后。
- 导入通常应该用空格分隔。
- 导入应按以下顺序分组。
- 标准库导入(Python 的内置模块)
- 相关第三方进口。
- 本地应用程序/库特定导入
在每个导入组中按字母顺序排列导入语句也很好。
# Python program showing
# how to style import statements
import math
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
绝对进口:
绝对导入涉及完整路径,即从项目的根文件夹到所需模块。绝对导入状态,即使用项目根文件夹中的完整路径导入的资源。
语法和实际示例:
让我们看看我们有以下目录结构:
这里有一个名为 project 的目录,其下有两个子目录,即pkg1
、 pkg2
。 pkg1
有两个模块,module1 和 module2。
pkg2 包含三个模块,module3、module4、 __init__.py
init__.py 和一个包含 module5.py 的子包名称 subpkg1。让我们假设以下内容:
-
pkg1 / module1.py
包含一个函数,fun1 -
pkg2 / module3.py
包含一个函数,fun2 -
pkg2 / subpkg1 / module5.py
包含一个函数fun3
# Python program showing
# practical example of
# absolute imports
# importing a fun1 from pkg1/module1
from pkg1.import module1 import fun1
from pkg1 import module2
# importing a fun2 from pkg2/module3
from pkg2 import module3 import fun2
# importing a fun3 from pkg2/subpkg1/module5
from pkg2.subpkg1.module5 import fun3
在此示例中,我们通过从根文件夹写入完整路径来导入模块。绝对进口的优缺点:
优点:
- 绝对导入非常有用,因为它们清晰且直截了当。
- 绝对导入很容易准确判断导入资源的位置,只需查看语句即可。
- 即使导入语句的当前位置发生变化,绝对导入仍然有效。
缺点:
如果目录结构非常大,那么绝对导入的使用没有意义。在这种情况下,使用相对导入效果很好。
from pkg1.subpkg2.subpkg3.subpkg4.module5 import fun6
相对进口:
相对导入指定从其当前位置导入的对象或模块,即导入语句所在的位置。有两种类型的相对进口:
- 隐式相对导入:
Python(3.x) 中不支持隐式相对导入。
- 显式相对导入:
Python(3.x) 已批准显式相对导入。
语法和实际示例:
相对导入的语法取决于当前位置以及要导入的模块或对象的位置。相对导入使用点 (.) 表示法来指定位置。单点表示模块在当前目录中,两个点表示模块在当前位置的父目录中,三个点表示在祖父目录中,以此类推。
让我们看看我们有以下目录结构:
让我们假设以下内容:
-
pkg1 / module1.py
包含一个函数,fun1 -
pkg2 / module3.py
包含一个函数,fun2 -
pkg2 / subpkg1 / module5.py
包含一个函数fun3
# Python program showing
# practical example of
# relative imports
# importing fun1 into pkg1/module1.py
from .module1 import fun1
# importing fun2 and fun3 into pkg2/module3.py
from .module3 import fun2
from .subpackage1.module5 import fun3
相对进口的优缺点:
优点:
- 使用相对导入是简洁明了的。
- 基于当前位置,它降低了导入语句的复杂性。
- 缺点:
- 相对导入不如绝对导入那么可读。
- 使用相对导入并不容易,因为很难分辨模块的位置。