面试题答案
一键面试语法区别
- 绝对导入:
- 在Python中,绝对导入从项目的根目录开始定位模块。例如,假设项目结构如下:
project/
│
├── main_package/
│ ├── sub_package/
│ │ └── module1.py
│ └── module2.py
└── main.py
- 在`main.py`中,若要导入`main_package.module2`,语法为`import main_package.module2`。若要从`module2.py`中导入`sub_package.module1`,可以使用`import main_package.sub_package.module1`。绝对导入明确指定了从项目根目录开始的完整路径。
2. 相对导入:
- 相对导入基于当前模块的位置来定位其他模块。使用点号(.
)来表示相对位置。单个点号(.
) 表示当前包,两个点号 (..
) 表示父包,依此类推。
- 仍以上述项目结构为例,在module2.py
中,若要导入sub_package.module1
,语法为from. sub_package import module1
。如果在sub_package.module1
中要导入module2.py
,语法为from.. import module2
。相对导入不能用于顶级脚本,即直接运行的Python脚本(通常是__main__
模块)。
适用场景
- 适合相对导入的项目结构:
- 大型包结构:当项目具有复杂的包层次结构,并且模块之间的关系紧密且相对位置固定时,相对导入很有用。例如,一个大型的框架项目,内部各个子包和模块之间相互依赖。假设项目结构为:
my_framework/
│
├── core/
│ ├── database/
│ │ ├── connection.py
│ │ └── query.py
│ └── utility/
│ └── helper.py
└── main.py
- 在`connection.py`中,如果要导入`helper.py`,使用相对导入`from..utility import helper`可以更清晰地表达模块之间的相对关系,并且即使项目的根目录发生变化(例如部署到不同路径),只要包结构不变,导入关系依然有效。
2. 适合绝对导入的项目结构: - 简单项目或脚本:对于一些小型脚本项目,没有复杂的包层次结构,绝对导入更加直观和简单。例如,一个简单的数据分析脚本项目:
data_analysis/
│
├── data_fetch.py
├── data_process.py
└── main.py
- 在`main.py`中,若要导入`data_fetch.py`,使用绝对导入`import data_fetch`就很直接明了。另外,当需要导入第三方库时,绝对导入是标准方式。例如,导入`numpy`库,使用`import numpy`,因为第三方库的位置是在Python环境的库目录中,通过绝对路径导入。