为什么推荐使用 import 而不是 from...import 语句?

2017-05-30 16:23:15 +08:00
 twitterpig

byte of python chinese version 72 页 如果导入到 mymodule 中的模块里已经存在了__version__这一名称,那将产生冲突。这可能是因为每个模块通常都会使用这一名称来声明它们各自的版本号。因此,我们大都推荐最好去使用 import 语句,尽管这会使你的程序变得稍微长一些。

搜索看了好几个地方,还是不是特别明白。求指教~谢谢~

4976 次点击
所在节点    Python
15 条回复
clavichord93
2017-05-30 16:37:03 +08:00
感觉他这句话已经说到位了啊。
binux
2017-05-30 17:21:31 +08:00
他说得很明白了啊,__version__ 这样的名称太过于常见了,它更适合看作是 module.__version__ 的一个属性,而不是单独的变量。所以 import module, 然后 module.__version__ 是合适的。
但是,如果是一个特定的类,例如 from collections import OrderedDict,OrderedDict 可以独立使用的类,那么 from...import 并没有问题。
twitterpig
2017-05-30 18:30:24 +08:00
@binux 表示明白了很多~谢谢~
halfcoder
2017-05-30 18:32:04 +08:00
应该是不推荐使用 from ... import * 语句吧?
TJT
2017-05-30 23:44:24 +08:00
@halfcoder 这个倒挺有用的,可以通过 __all__ 来限制 from ... import * 导入的东西,很多库都会用到。
NoAnyLove
2017-05-31 07:23:05 +08:00
《 The Hitchhiker ’ s Guide to Python 》( http://docs.python-guide.org/en/latest/writing/structure/#modules )中解释:`import foo`这种方式更有助于可读性,在函数调用时(`foo.bar()`)能够让人一眼辨认出使用的函数来自于哪个 Module,提高了可读性和易于理解(单文件的简单代码除外)。而`from foo import bar`这种方式,仅仅在之后的调用中能够省略一些输入。
xiaket
2017-05-31 07:37:37 +08:00
from xyz import abcd, efgh 这么一下子进来了两个或多个名字. 如果这些个名字都不是很广为人知的话,是更容易引起名称冲突的.
PythonAnswer
2017-05-31 11:02:12 +08:00
from 没有不建议使用。只是不建议用*。
Django 系非常喜欢用 from。
zhengxiaowai
2017-05-31 11:08:55 +08:00
在不同的书中推荐的也不一样。总结来看是这样子的

- 推荐 import 的理由是防止命名空间的污染,使用起来有逻辑一眼就看出从哪个包出来的
- 推荐使用 from xxx import xxx 的理由是按需导入,减少内存的占用,容易污染当前命名空间

所以还是 直接 import 好像比较好,内存什么的只要不爆炸都好说。
GTim
2017-05-31 11:15:16 +08:00
这个和 c++ std 包不建议 using 是同样的道理
weyou
2017-05-31 11:21:08 +08:00
应该是不推荐使用 from ... import * , 否者__version__哪里来的冲突,没有人会导入__version__吧。
halfcoder
2017-05-31 15:39:00 +08:00
@TJT #5
__all__严格来说应该是限制 module 导出的东西,确实很多库用到了这个特性来隐藏一些写在 module 中的私有类 /函数
但是一个库还是应该导出了__version__的吧,from ... import * 名称污染不可避……
TJT
2017-05-31 16:57:07 +08:00
@halfcoder
@weyou

`import *` 不会导入 module 里面下划线开头的东西,所以除非显示声明了 __version__ 在 __all__ 里面,否则是不会自动导入的,所以也不存在 __version__ 的冲突或名称污染。

__all__ 的作用就是用来重写 `import *` 的行为,可以用来隐藏 public property, 也可以暴露 private property.
yanzixuan
2017-05-31 22:22:28 +08:00
@zhengxiaowai 忘了哪本书说的了,import 限定了字典查找的范围,资源消耗少。如果全部搞一起,查起来费力了。
shawndev
2017-06-05 09:43:01 +08:00
不建议 from ... import * 吧,看过这个说法,主要是为了防止命名冲突

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX