'从X导入'与'导入X; XA"

cdl*_*ary 9 python maintainability duck-typing python-import

我已经看到一些Python程序员相当一致地使用以下样式(我们称之为样式1):

import some_module
# Use some_module.some_identifier in various places.
Run Code Online (Sandbox Code Playgroud)

为了支持这种风格,你可以引用"明确胜于隐性"的格言.我见过其他程序员使用这种风格(风格2):

from some_module import some_identifier
# Use some_identifier in various places.
Run Code Online (Sandbox Code Playgroud)

我在样式2中看到的主要好处是可维护性 - 特别是对于duck typing理想我可能想要some_module替换some_other_module.我还觉得"可读性计数"格言的风格2胜.虽然我倾向于不同意,但人们总是认为在使用第一种风格时,搜索和替换是一个很好的选择.

附录:有人指出,你可以使用as从解决开关some_modulesome_other_module在风格1.我忘了提,这也是常见的决定实现some_identifier您在目前的模块,这使得同等的创建some_module容器略显尴尬.

Gre*_*ill 5

存在以下语法:

import some_other_module as some_module
Run Code Online (Sandbox Code Playgroud)

样式2的可维护性参数不再相关.

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


Bri*_*ian 5

两种情况都有用途,所以我不认为这是一个或两个问题.我考虑在以下情况下使用模块import x,y,z:

  • 导入的东西数量相当少

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

  • 这些名字不会发生冲突.与上述类似,但更重要. 永远不要做以下事情:

     from os import open
    
    Run Code Online (Sandbox Code Playgroud)

import module [as renamed_module]它的优点是它可以为您使用它时所调用的内容提供更多的上下文.它的缺点是,当模块没有真正提供更多信息时,这会更加混乱,而且性能稍差(2次查找而不是1次).

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

import config
config.dburl = 'sqlite:///test.db'
Run Code Online (Sandbox Code Playgroud)

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