python - 导入外部包的正确约定是什么?

标签 python import package

我想构建自己的包,在其中使用包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

导入始终放在文件顶部

紧接在任何模块注释和文档字符串之后、模块全局变量和常量之前。

导入应按以下顺序分组:

  1. 标准库导入。
  2. 相关第三方进口。
  3. 本地应用程序/库特定的导入。

您应该在每组导入之间放置一个空行。

建议绝对导入

如果导入系统配置不正确(例如当包内的目录最终位于 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)的准则仍然适用。

更多信息请点击:https://www.python.org/dev/peps/pep-0008/#imports

关于python - 导入外部包的正确约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66599537/

相关文章:

java - 如何从作为字符串给出的 java 代码中解析包?

Python:如何断言可迭代的第一个元素的类型?

python - 为什么我收到 RuntimeError : generator raised StopIteration? 以及如何解决它?

python - 如何确定 pythondecorator 函数中的被调用者详细信息?

java - org.slf4j.Logger 错误

python - 我在更新 pip 以安装 python 包时遇到问题

python - 打包 __init__ 进行测试

python - 在 python 中模拟 redis

python - 如何将枚举名称用作其他信息的值

import - 用普通的 lisp 加载文件