V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
twitterpig
V2EX  ›  Python

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

  •  
  •   twitterpig · 2017-05-30 16:23:15 +08:00 · 4947 次点击
    这是一个创建于 2740 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    15 条回复    2017-06-05 09:43:01 +08:00
    clavichord93
        1
    clavichord93  
       2017-05-30 16:37:03 +08:00   ❤️ 1
    感觉他这句话已经说到位了啊。
    binux
        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 并没有问题。
    twitterpig
        3
    twitterpig  
    OP
       2017-05-30 18:30:24 +08:00
    @binux 表示明白了很多~谢谢~
    halfcoder
        4
    halfcoder  
       2017-05-30 18:32:04 +08:00   ❤️ 2
    应该是不推荐使用 from ... import * 语句吧?
    TJT
        5
    TJT  
       2017-05-30 23:44:24 +08:00
    @halfcoder 这个倒挺有用的,可以通过 __all__ 来限制 from ... import * 导入的东西,很多库都会用到。
    NoAnyLove
        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`这种方式,仅仅在之后的调用中能够省略一些输入。
    xiaket
        7
    xiaket  
       2017-05-31 07:37:37 +08:00
    from xyz import abcd, efgh 这么一下子进来了两个或多个名字. 如果这些个名字都不是很广为人知的话,是更容易引起名称冲突的.
    PythonAnswer
        8
    PythonAnswer  
       2017-05-31 11:02:12 +08:00 via Android
    from 没有不建议使用。只是不建议用*。
    Django 系非常喜欢用 from。
    zhengxiaowai
        9
    zhengxiaowai  
       2017-05-31 11:08:55 +08:00
    在不同的书中推荐的也不一样。总结来看是这样子的

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

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

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

    __all__ 的作用就是用来重写 `import *` 的行为,可以用来隐藏 public property, 也可以暴露 private property.
    yanzixuan
        14
    yanzixuan  
       2017-05-31 22:22:28 +08:00
    @zhengxiaowai 忘了哪本书说的了,import 限定了字典查找的范围,资源消耗少。如果全部搞一起,查起来费力了。
    shawndev
        15
    shawndev  
       2017-06-05 09:43:01 +08:00
    不建议 from ... import * 吧,看过这个说法,主要是为了防止命名冲突
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5544 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 08:45 · PVG 16:45 · LAX 00:45 · JFK 03:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.