【问题标题】:Is it a good idea to import packages from other packages in Python?从 Python 中的其他包导入包是个好主意吗?
【发布时间】:2017-09-20 09:02:36
【问题描述】:

假设有一些知名的(第三方)Python 包a,它依赖于另一个知名的包b(例如,分别为imageionumpy)。两者都可以通过 pip 获得。

现在假设我自己的代码明确使用了ab。软件包版本在我的requirements.txt 中修复。

我看到了一些用于导入和使用这些包的选项,如下所述。对我来说,选项 2 和 3 看起来最干净,因为它们似乎减少了我需要明确管理的依赖项的数量。

从依赖管理的角度来看,是否有导入这些包的首选方式?还是只是风格问题?

选项 1:

import a
import b
...
a.something()
b.something_else()
...

选项 2:

import a  # which imports b
...
a.something()
a.b.something_else()
...

选项 3:

import a
from a import b
...
a.something()
b.something_else()
...

附言以下问题似乎相关但未提供答案:1234

【问题讨论】:

  • 我选择选项 1,因为我不确定库 a 将来何时会使用 lib c 代替 b
  • 如果您不需要使事情复杂化,请不要。做任何看似本能的事情(我相当肯定大多数人都是选项 1)。

标签: python python-import


【解决方案1】:

您应该始终明确地管理您的直接依赖项,而不是依赖于 3rd 方包的内部实现细节。这些可能会随着未来的更新而改变(除非第 3 方包明确声明它公开了某些特定的包)并且您的代码将中断。如果您依赖包 b,请将其放入您的 requirements.txt import b 明确。

【讨论】:

    【解决方案2】:

    Python 社区的一句格言是:“扁平优于嵌套”。出于这个原因,我不喜欢选项 2。它的可读性较差。此外,如果包 A 应该改变它组织其命名空间的方式,选项 2 可能会中断。

    选项 1 和 3 在代码主体中的读法相同,因此我无法在它们之间进行选择。

    【讨论】:

    • 谢谢。但是选项 3 不是 2 的变体,因为它从 a 得到 b
    • 确实,选项2和3都从a得到b。但是嵌套函数调用的可读性不如平面函数调用。此外,用户“anuragal”指出,选项 3 的导入依赖项与我在选项 2 中确定的相同。现在我觉得选择选项 1 而不是其他两个选项很舒服。
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2018-04-05
    • 2017-10-05
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2017-08-15
    • 2018-03-31
    相关资源
    最近更新 更多