从X导入a与导入X; X.a的区别

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赢得了“可读性至上”的信任。虽然我倾向于不同意,但人们总是可以争辩说,在使用第一种风格时,查找和替换也是一个很好的选择。
补充说明:有人指出你可以使用as来解决从some_module切换到some_other_module的问题。我忘了提到,通常还会决定在您的当前模块中实现some_identifier,这使得创建等效的some_module容器略显尴尬。
9个回答

5

由于以下语法的存在:

import some_other_module as some_module

我倾向于使用样式1。通常情况下,在一个典型的Python程序中,我只会显式地引用导入包名称几次。其余的都是对象上的方法,当然不需要引用导入的包。


5

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

  • There are a fairly small number of things to import

  • The purpose of the functions imported is obvious when divorced from the module name. If the names are fairly generic, they may clash with others and tell you little. eg. seeing remove tells you little, but os.remove will probably hint that you're dealing with files.

  • The names don't clash. Similar to the above, but more important. Never do something like:

     from os import open
    

import module [as renamed_module]的优点是在使用时能够更清晰地了解正在调用什么内容。缺点是当模块并没有提供更多信息时会显得有些冗杂,而且稍微影响性能(需要进行两次查找而不是一次)。

但是在测试时它也有优势(例如:用模拟对象替换os.open而无需更改每个模块),应该在使用可变模块时使用,例如:

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

如果不确定,我总是会选择使用import module的方式。


2

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

我的例外是在像Django这样的大型框架中深度嵌套的模块。它们的模块名称往往很长,它们的示例都说from django.conf import settings以便在各处节省输入django.conf.settings.DEBUG的时间。

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


2

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

import some_module as sm
x = sm.whatever

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

from some_module import whatever
x = whatever

假设我不需要从其他模块中获取whatever,当然。

我倾向于在导入时使用as子句,这样我就可以减少打字在将来轻松替换另一个模块。


1

我发现这个符号表示法

from some_module import some_symbol

在大多数情况下,这是最好的选择。此外,如果符号名称发生冲突,您可以使用:

from some_module import some_symbol as other_symbol

正如问题所述,它避免了每次都重写模块名称的麻烦,同时也避免了因打错字而出现的错误风险。我使用以下语法:
import  module [as other_module]

只有两种情况:

  1. 我使用了太多的模块函数/对象,无法全部导入
  2. 该模块定义了一些在执行过程中可能会更改的符号


0

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

import some_other_module as some_module

所以你仍然可以选择样式1并稍后换入不同的模块。

我认为它通常映射到你想要多乱你的命名空间。你只会在模块中使用一个或两个名称吗?还是全部使用它们(from x import * 不总是不好的,只是一般情况下)?


0

个人而言,我尽量不去过多地操作我的命名空间,在大多数情况下,我只是这样做:

import module  

或者 导入模块作为mod

唯一的真正区别是当我有一个使用频率很高的单个类模块时。如果我已经对list类型进行了子类化以添加一些功能,那么我会使用

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对读者来说更加熟悉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接