2008-10-09 132 views
7

我已经看到一些Python程序员使用下面的风格非常一致(我们称之为样式1):'from X import a'versus'import X; X.a”

import some_module 
# Use some_module.some_identifier in various places. 

为了支持这种风格,可以举"explicit is better than implicit"格言。我见过的其他程序员使用这种样式(样式2):

from some_module import some_identifier 
# Use some_identifier in various places. 

,我的风格2中看到的主要好处是可维护性 - 尤其是duck typing理想我可能要交换some_module为some_other_module。我同样以"readability counts"的格言来感受风格2的胜利。尽管我倾向于不同意,但人们总是可以争辩说,在使用第一种风格时,搜索和替换也是一个很好的选择。

附录:有人指出,你可以在风格1.使用as从解决some_module交换机some_other_module我忘了提及的是,还共同决定你当前模块,在实现some_identifier哪些使创造一个等效的容器稍微尴尬。

回答

4

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

  • 有一个相当小的一些事情导入

  • 进口功能的目的,从模块名称离婚时,是显而易见的。如果名字相当通用,他们可能会与其他人发生冲突,并告诉你一点。例如。看到remove告诉你一点,但os.remove可能会暗示你正在处理文件。

  • 名称不冲突。与上面类似,但更重要。 决不做这样的事情:

    from os import open 
    

import module [as renamed_module]的优点是,它提供了有关当您使用它现在被称为多一点背景。它的缺点是,当模块没有真正提供更多信息时,这会变得更加混乱,并且性能略低(2次查找而不是1次)。

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

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

如果有疑问,我总是会用import module的风格。

5

以下语法的存在:

import some_other_module as some_module 

的风格2可维护性参数已不再相关。

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

2

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

import some_module as sm 
x = sm.whatever 

如果只有一两件事情,我需要:

from some_module import whatever 
x = whatever 

这是假设我不需要一个whatever当然是some_other_module

我倾向于在导入中使用as子句,以便我可以在未来轻松地将另一个模块替换为另一个模块。

0

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

import some_other_module as some_module 

所以,你仍然可以用风格1和交换去不同的模块后上。

我认为它通常映射到你想要混乱你的名字空间。你会在模块中使用一个还是两个名字?或者他们全部(from x import *不是总是不好,一般)?

1

我发现符号

from some_module import some_symbol 

最适合在大多数情况下。此外,在名字交锋符号的情况下,你可以使用:

from some_module import some_symbol as other_symbol 

由于该问题时,它避免了重写模块名称所有的时间,与错误输入它的风险各一次。我使用的语法:

import module [as other_module] 

只有在两种情况下:

  1. 我用太多的模块功能/对象以导入所有
  2. 模块定义了一些符号,它可能会在执行过程中改变
2

我喜欢import X然后用X.a尽可能。

我的异常集中在像Django这样的大型框架中的深层嵌套模块。他们的模块名称往往会变得冗长,他们的例子都说from django.conf import settings为您节省您在任何地方输入django.conf.settings.DEBUG

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

0

我个人尽量不要惹太多与我的命名空间,所以在大多数情况下,我只是做

import module 

或 导入模块为国防部

只有真正diffrence是当我有一个模块一个使用了很多的单一类。如果我有一个sublclassed型list添加一些的funcionality那里,我会使用

from SuperImprovedListOverloadedWithFeatures import NewLIst 
nl = NewList() 

0

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

from john import cleese 
from terry import jones, gilliam 

。如果我期望使用大部分模块并且模块名称很短,我将导入整个模块(例如oswx)。如果存在名称冲突,我还会导入整个模块,或者我想提醒读者该函数与哪个关联。

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将是读者比较熟悉。

相关问题