我想构建自己的包,在其中使用包numpy
。对于更直观的示例,让我们考虑:
import numpy as np
def my_fun(x, y):
return np.linspace(x, y)
我的问题是:有没有更好的方法来包含外部包?我在包 numpy
的源代码中看到它们使用完全相同的约定,即在函数脚本中导入包。我们有更好的方法吗?
例如,拥有另一个仅包含导入包的 .py
文件
最佳答案
根据 PEP 8 风格指南:
导入通常应位于单独的行
# Correct:
import os
import sys
# Wrong:
import sys, os
不过这样说也没关系:
# Correct:
from subprocess import Popen, PIPE
导入始终放在文件顶部
紧接在任何模块注释和文档字符串之后、模块全局变量和常量之前。
导入应按以下顺序分组:
- 标准库导入。
- 相关第三方进口。
- 本地应用程序/库特定的导入。
您应该在每组导入之间放置一个空行。
建议绝对导入
如果导入系统配置不正确(例如当包内的目录最终位于 sys.path 上时),它们通常更具可读性并且往往表现更好(或至少给出更好的错误消息):
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
但是,显式相对导入是绝对导入的可接受替代方案,特别是在处理复杂的包布局时,使用绝对导入会不必要地冗长:
from . import sibling
from .sibling import example
标准库代码应避免复杂的包布局并始终使用绝对导入。
绝对不应使用隐式相对导入,并且已在 Python 3 中删除。
从包含类的模块导入类时。
通常可以这样拼写:
from myclass import MyClass
from foo.bar.yourclass import YourClass
如果此拼写导致本地名称冲突,请明确拼写它们:
import myclass
import foo.bar.yourclass
并使用“myclass.MyClass”和“foo.bar.yourclass.YourClass”。
应避免通配符导入(来自 import *)。
它们使得命名空间中存在哪些名称变得不清楚,让读者和许多自动化工具感到困惑。通配符导入有一个合理的用例,即重新发布内部接口(interface)作为公共(public) API 的一部分(例如,使用可选加速器模块中的定义覆盖接口(interface)的纯 Python 实现,以及哪些定义将被覆盖)被覆盖是事先不知道的)。
以这种方式重新发布名称时,以下有关公共(public)和内部接口(interface)的准则仍然适用。
关于python - 导入外部包的正确约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66599537/