【问题标题】:Advantages of `from foo import spam` over `from foo import *` [duplicate]`from foo import spam` 优于 `from foo import *` 的优势 [重复]
【发布时间】:2012-02-25 01:23:37
【问题描述】:

可能重复:
Should wildcard import be avoided?

from foo import spamfrom foo import * 相比,除了不导入所有函数之外,还有哪些优势?

它会节省内存吗?或者它只是语法糖,但实际上导入了所有内容? 我在哪里可以找到更多关于它的信息?

如果它确实可以节省内存,那它是如何工作的?

【问题讨论】:

  • from foo import * 将导入 foo 中的所有内容 - 全局变量、方法、类,包括 foo 包含的内容,而 from foo import spam 将仅导入 spam。想象一个具有数百个变量和方法的模块 - 您只想导入 spam 以停止名称冲突,并帮助提高性能和内存使用
  • 为了回答一个特定的问题(它不是一个精确重复的):关于记忆,它没有任何区别。导入过程完全一样,只是后面的绑定过程不同。

标签: python


【解决方案1】:

使用您未显式导入的名称污染全局命名空间是一个坏主意。如果不阅读已导入的每个模块的源代码,就不可能知道您稍后在代码中使用的名称实际上是从哪里导入的,并且有两个模块使用相同名称的风险,这可能会破坏事情。

【讨论】:

    【解决方案2】:

    导入 * 将导入 foo 中存在的所有内容, 其中 import spam 只会导入所需的属性。

    这就像在代码中有未使用的变量/方法。 如果您开始使用 pylint 之类的工具对代码进行评分,则使用未使用的变量和方法会降低评分

    【讨论】:

      【解决方案3】:

      如果您需要foo 的所有内容或大部分内容,那么from foo import * 会更好,但如果您只需要spam,那么from foo import spam 会为您完成这项工作。

      【讨论】:

        【解决方案4】:

        除了其他原因,一件事是表单的导入: from foo import spam 帮助是它提高了代码的可读性。通过查看上面的语句,可以清楚地知道当前模块对模块 foo 有什么依赖。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-15
          • 2015-11-21
          • 1970-01-01
          • 1970-01-01
          • 2021-11-11
          • 2012-08-30
          • 2017-11-09
          相关资源
          最近更新 更多