📜  Python中的绝对和相对导入

📅  最后修改于: 2022-05-13 01:55:24.875000             🧑  作者: Mango

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代码以最大限度地提高其可读性的规则。为了编写导入语句,需要遵循以下几点:

  1. 导入应该总是写在文件的顶部,就在任何模块注释和文档字符串之后。
  2. 导入通常应该用空格分隔。
  3. 导入应按以下顺序分组。
    • 标准库导入(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 的目录,其下有两个子目录,即pkg1pkg2pkg1有两个模块,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

相对进口的优缺点:
优点:

  • 使用相对导入是简洁明了的。
  • 基于当前位置,它降低了导入语句的复杂性。
      缺点:
      • 相对导入不如绝对导入那么可读。
      • 使用相对导入并不容易,因为很难分辨模块的位置。