【问题标题】:What's the correct convention of importing external packages?导入外部包的正确约定是什么?
【发布时间】:2021-03-12 12:00:37
【问题描述】:

我想构建自己的包,我在其中使用包numpy。对于更直观的示例,让我们考虑:

import numpy as np
def my_fun(x, y):
    return np.linspace(x, y)

我的问题是:有没有更好的方法来包含外部包?我在包numpy 的源代码中看到它们使用完全相同的约定,即在函数脚本中导入包。我们有更好的方法吗?
例如有另一个 .py 文件只包含导入的包

【问题讨论】:

  • 这能回答你的问题吗? Python naming conventions for modules
  • 这不完全是关于命名,而是更多关于文件的布局
  • 嗨@John!请查看我的答案,如果这是您要找的,请考虑接受它作为正确的答案

标签: python import package


【解决方案1】:

根据 PEP 8 风格指南:

导入通常应该在单独的行中

# Correct:
import os
import sys
# Wrong:
import sys, os

尽管这样说是可以的:

# Correct:
from subprocess import Popen, PIPE

导入总是放在文件的顶部

就在任何模块 cmets 和文档字符串之后,模块全局变量和常量之前。

进口应按以下顺序分组:

  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 *)。

它们使命名空间中存在哪些名称变得不清楚,从而使读者和许多自动化工具感到困惑。通配符导入有一个可辩护的用例,即重新发布一个内部接口作为公共 API 的一部分(例如,用可选加速器模块中的定义覆盖接口的纯 Python 实现,以及哪些定义将被被覆盖是事先不知道的)。

以这种方式重新发布名称时,以下关于公共和内部接口的准则仍然适用。

更多信息在这里:https://www.python.org/dev/peps/pep-0008/#imports

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2021-01-17
    • 1970-01-01
    • 2016-10-27
    • 2019-09-04
    • 2016-01-11
    相关资源
    最近更新 更多