byte of python chinese version 72 页 如果导入到 mymodule 中的模块里已经存在了__version__这一名称,那将产生冲突。这可能是因为每个模块通常都会使用这一名称来声明它们各自的版本号。因此,我们大都推荐最好去使用 import 语句,尽管这会使你的程序变得稍微长一些。
搜索看了好几个地方,还是不是特别明白。求指教~谢谢~
1
clavichord93 2017-05-30 16:37:03 +08:00 1
感觉他这句话已经说到位了啊。
|
2
binux 2017-05-30 17:21:31 +08:00 2
他说得很明白了啊,__version__ 这样的名称太过于常见了,它更适合看作是 module.__version__ 的一个属性,而不是单独的变量。所以 import module, 然后 module.__version__ 是合适的。
但是,如果是一个特定的类,例如 from collections import OrderedDict,OrderedDict 可以独立使用的类,那么 from...import 并没有问题。 |
3
twitterpig OP @binux 表示明白了很多~谢谢~
|
4
halfcoder 2017-05-30 18:32:04 +08:00 2
应该是不推荐使用 from ... import * 语句吧?
|
5
TJT 2017-05-30 23:44:24 +08:00
@halfcoder 这个倒挺有用的,可以通过 __all__ 来限制 from ... import * 导入的东西,很多库都会用到。
|
6
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`这种方式,仅仅在之后的调用中能够省略一些输入。
|
7
xiaket 2017-05-31 07:37:37 +08:00
from xyz import abcd, efgh 这么一下子进来了两个或多个名字. 如果这些个名字都不是很广为人知的话,是更容易引起名称冲突的.
|
8
PythonAnswer 2017-05-31 11:02:12 +08:00 via Android
from 没有不建议使用。只是不建议用*。
Django 系非常喜欢用 from。 |
9
zhengxiaowai 2017-05-31 11:08:55 +08:00
在不同的书中推荐的也不一样。总结来看是这样子的
- 推荐 import 的理由是防止命名空间的污染,使用起来有逻辑一眼就看出从哪个包出来的 - 推荐使用 from xxx import xxx 的理由是按需导入,减少内存的占用,容易污染当前命名空间 所以还是 直接 import 好像比较好,内存什么的只要不爆炸都好说。 |
10
GTim 2017-05-31 11:15:16 +08:00
这个和 c++ std 包不建议 using 是同样的道理
|
11
weyou 2017-05-31 11:21:08 +08:00
应该是不推荐使用 from ... import * , 否者__version__哪里来的冲突,没有人会导入__version__吧。
|
12
halfcoder 2017-05-31 15:39:00 +08:00
@TJT #5
__all__严格来说应该是限制 module 导出的东西,确实很多库用到了这个特性来隐藏一些写在 module 中的私有类 /函数 但是一个库还是应该导出了__version__的吧,from ... import * 名称污染不可避…… |
13
TJT 2017-05-31 16:57:07 +08:00
|
14
yanzixuan 2017-05-31 22:22:28 +08:00
@zhengxiaowai 忘了哪本书说的了,import 限定了字典查找的范围,资源消耗少。如果全部搞一起,查起来费力了。
|
15
shawndev 2017-06-05 09:43:01 +08:00
不建议 from ... import * 吧,看过这个说法,主要是为了防止命名冲突
|