使用“导入模块”或“从模块导入”?

新手上路,请多包涵

我试图找到关于最好使用 import module 还是 from module import 的综合指南。我刚开始使用 Python,我正试图从最佳实践入手。

基本上,我希望是否有人可以分享他们的经验、其他开发人员有哪些偏好以及避免任何 陷阱 的最佳方法是什么?

原文由 Filip Dupanović 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 243
2 个回答

import modulefrom module import foo 之间的区别主要是主观的。选择您最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助您做出决定。

import module

  • 优点:
    • 减少对 import 语句的维护。不需要添加任何额外的导入即可开始使用模块中的另一个项目
  • 缺点:
    • 在代码中键入 module.foo 可能是乏味和冗余的(可以通过使用 import module as mo 然后键入 mo.foo 19a– 来减少乏味)

from module import foo

  • 优点:
    • 少打字使用 foo
    • 更好地控制可以访问模块的哪些项目
  • 缺点:
    • 要使用模块中的新项目,您必须更新您的 import 声明
    • 您失去了有关 foo 的上下文。例如,不太清楚 ceil()math.ceil() 相比

两种方法都可以接受,但 不要 使用 from module import *

对于任何合理的大型代码集,如果您 import * 您可能会将其固定到模块中,无法删除。这是因为很难确定代码中使用的哪些项目来自“模块”,因此很容易达到您认为您不再使用 import 的地步,但它非常很难确定。

原文由 Mark Roddy 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里还有另一个细节,没有提到,与写入模块有关。当然这可能不是很常见,但我不时需要它。

由于引用和名称绑定在 Python 中的工作方式,如果您想从该模块外部更新模块中的某些符号,比如 foo.bar,并让其他导入代码“看到”该更改,您必须导入 foo a某种方式。例如:

模块富:

 bar = "apples"

模块一:

 import foo
foo.bar = "oranges"   # update bar inside foo module object

模块b:

 import foo
print foo.bar        # if executed after a's "foo.bar" assignment, will print "oranges"

但是,如果您导入符号名称而不是模块名称,这将不起作用。

例如,如果我在模块 a 中这样做:

 from foo import bar
bar = "oranges"

No code outside of a will see bar as “oranges” because my setting of bar merely affected the name “bar” inside module a ,它没有“进入” foo 模块对象并更新其 bar

原文由 Michael Ray Lovett 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题