9

我见过一些 Python 程序员相当一致地使用以下风格(我们称之为风格 1):

import some_module
# Use some_module.some_identifier in various places.

为了支持这种风格,您可以引用“显式优于隐式”的格言。我见过其他程序员使用这种风格(风格 2):

from some_module import some_identifier
# Use some_identifier in various places.

我在样式 2 中看到的主要好处是可维护性——尤其是对于鸭子类型的理想,我可能想将 some_module 换成 some_other_module。我也觉得风格 2 以“可读性很重要”的格言赢得了积分。尽管我倾向于不同意,但人们总是可以争辩说,在使用第一种样式时,搜索和替换同样是一个不错的选择。

附录:有人指出,您可以使用样式 1as来解决从some_moduleto的切换some_other_module。我忘了提到,决定some_identifier当前模块中实现也很常见,这使得创建等效some_module容器有点尴尬。

4

9 回答 9

5

存在以下语法:

import some_other_module as some_module

样式 2 的可维护性论点不再相关。

我倾向于使用样式 1。通常,我发现在典型的 Python 程序中我只显式引用了几次导入的包名称。其他都是对象上的方法,当然不需要引用导入的包。

于 2008-10-09T09:08:22.150 回答
5

这两种情况都有用,所以我不认为这是一个非此即彼的问题。在以下情况下,我会考虑使用 from 模块import x,y,z

  • 要导入的东西很少

  • 与模块名称分离时,导入函数的目的是显而易见的。如果名称相当通用,它们可能会与其他名称发生冲突,并且几乎不会告诉您什么。例如。看到remove告诉你很少,但os.remove可能会暗示你正在处理文件。

  • 名字不冲突。与上述类似,但更重要。 永远不要做类似的事情:

     from os import open
    

import module [as renamed_module]优点是它提供了更多关于使用它时所调用内容的上下文。它的缺点是,当模块没有真正提供更多信息时,这有点混乱,并且性能略低(2 次查找而不是 1 次)。

然而,它在测试时也有优势(例如,用模拟对象替换 os.open,而不必更改每个模块),并且应该在使用可变模块时使用,例如

import config
config.dburl = 'sqlite:///test.db'

如果有疑问,我总是会选择这种import module风格。

于 2008-10-09T11:24:46.773 回答
2

我通常使用阈值来决定这一点。如果我想在 中使用很多东西some_module,我会使用:

import some_module as sm
x = sm.whatever

如果我只需要一两件事:

from some_module import whatever
x = whatever

当然,这是假设我不需要whateverfrom some_other_module

我倾向于as在导入时使用该子句,以便将来可以轻松地减少输入替换另一个模块。

于 2008-10-09T09:09:49.230 回答
2

我更喜欢import X然后X.a尽可能多地使用。

我的异常集中在像 Django 这样的大框架中的深层嵌套模块上。他们的模块名称往往会变得很长,而且他们的示例都说from django.conf import settings可以节省您django.conf.settings.DEBUG在任何地方打字的时间。

如果模块名称嵌套很深,则例外是使用from X.Y.Z import a.

于 2008-10-09T10:13:42.563 回答
1

我发现符号

from some_module import some_symbol

在大多数情况下效果最好。此外,如果符号名称冲突,您可以使用:

from some_module import some_symbol as other_symbol

正如问题所述,它避免了一直重写模块名称,每次都有输入错误的风险。我使用以下语法:

import  module [as other_module]

仅在两种情况下:

  1. 我使用了太多的模块函数/对象来全部导入
  2. 模块定义了一些在执行过程中可能会改变的符号
于 2008-10-09T09:37:03.370 回答
0

我相信更新版本的 Python(2.5+?必须检查我的事实......)你甚至可以这样做:

import some_other_module as some_module

因此,您仍然可以使用样式 1 并稍后换入不同的模块。

我认为它通常映射到你想要多少混乱你的命名空间。您会在模块中只使用一两个名称吗?或者所有这些(from x import *并不总是坏的,只是一般来说)?

于 2008-10-09T09:10:18.387 回答
0

我个人尽量不要把我的命名空间搞得太乱,所以在大多数情况下我只是这样做

import module  

或将模块导入为 mod

唯一真正的区别是当我有一个带有一个经常使用的类的模块时。如果我对一个list类型进行了子类化以在那里添加一些功能,我会使用

from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()

等等

于 2008-10-09T10:16:30.950 回答
0

我倾向于只使用每个模块的几个成员,所以有很多

from john import cleese
from terry import jones, gilliam

在我的代码中。如果我希望使用大部分模块并且模块名称很短,我将导入整个模块(例如os或)。wx如果存在名称冲突或者我想提醒读者该函数与什么相关联,我还将导入整个模块。

import michael
import sarah

import wave

gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)

(我可以使用from wave import open as wave_open,但我认为这wave.open对读者来说会更熟悉。

于 2008-10-09T13:54:15.847 回答
0

您可能对 Stack Overflow 问题感兴趣,为什么 'import x;xy' 的行为与 'from x import y' 不同,第一个在 package x 时失败。init没有完成?.

于 2011-06-17T12:58:47.533 回答