从X进a'与'进口X;X.一个'
-
06-07-2019 - |
题
我已经看到了一些蟒蛇的程序员,使用下面的样式相当一致(我们称它式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
在风格1中。我忘了提及,这也是共同决定的执行 some_identifier
在你 电流 模块,这使得建立一个等效 some_module
容器略尴尬。
解决方案
有采用为这两种情况下,所以我不认为这是一个非此即彼的问题。我会考虑使用的模块 import x,y,z
当:
有一个相当小的多的事情要进口
目的功能,进口是明显的时候离婚的模块名称。如果名字是相当一般,它们可能与冲突其他人,告诉你点。例如。看到
remove
告诉你个小,但是os.remove
可能会暗示你正在处理的文件。名字不发生冲突。与上述相似,但更加重要。 从来没有 做喜欢的东西:
from os import open
import module [as renamed_module]
具有的优点在于它给多一点下文关于什么是被称为当你使用它。它具有的缺点是,这是一个比较杂乱时该模块是不是真的给予更多的信息,并略低性能(2查找,而不是1)。
它还具有优点,当测试,但是(如。替换操作系统。打开一个模拟对象,而不必改变每个模块),并应使用当使用可变的模块,例如
import config
config.dburl = 'sqlite:///test.db'
如果有疑问,我总是会去的 import module
风格。
其他提示
存在以下语法:
import some_other_module as some_module
样式2的可维护性参数不再相关。
我倾向于使用样式1.通常,我发现在典型的Python程序中我只显式引用了几次导入的包名。其他一切都是对象上的方法,当然不需要引用导入的包。
我通常使用阈值来决定这一点。如果我想在 some_module
中使用很多东西,我会使用:
import some_module as sm
x = sm.whatever
如果我只需要一两件事:
from some_module import whatever
x = whatever
当然,假设我不需要 some_other_module
中的
。
我倾向于在导入时使用 as
子句,以便我可以在将来轻松地减少输入和替换另一个模块。
我更喜欢 import X
,然后尽可能使用 X.a
。
我的例外以Django这样的大框架中的深层嵌套模块为中心。他们的模块名称往往变得冗长,他们的例子都说来自django.conf导入设置的,以节省你在任何地方输入
django.conf.settings.DEBUG
。
如果模块名称是深层嵌套的,那么例外是使用X.Y.Z中的导入
。
我发现了符号
from some_module import some_symbol
在大多数情况下效果最佳。此外,如果符号出现名称冲突,您可以使用:
from some_module import some_symbol as other_symbol
正如问题所述,它避免了一直重写模块名称,每次都有冒充错误的风险。我使用语法:
import module [as other_module]
仅在两种情况下:
- 我使用了太多的模块函数/对象来导入它们
- 模块定义了一些可能在执行期间更改的符号 醇>
我个人尽量不要过多地使用我的命名空间,所以在大多数情况下我只是做
import module
或 导入模块为mod
只有真正的差异才是我有一个单独使用过很多类的模块。如果我已经将 list
类型转换为在那里添加一些功能,我会使用
from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()
等
我倾向于只使用每个模块的几个成员,因此有很多
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)
(我可以使用波形导入中的打开wave_open
,但我认为读者会更熟悉 wave.open
。
您可能对Stack Overflow问题 为什么导入x; xy'与'from x import y'的行为不同,当包x。 init 未完成时,第一个失败? 。
我相信更新版本的Python(2.5+?必须检查我的事实......)你甚至可以这样做:
import some_other_module as some_module
所以你仍然可以使用样式1并稍后交换不同的模块。
我认为它通常会映射到您希望混淆命名空间的程度。你会在模块中使用一个或两个名字吗?或者所有这些( from x import *
并不总是坏的,只是一般)?