推荐学习书目
› 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 · May 30, 2017 · 6158 views
    This topic created in 3449 days ago, the information mentioned may be changed or developed.

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

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

    15 replies  •  2017-06-05 09:43:01 +08:00
    clavichord93
    clavichord93
    May 30, 2017❤️1
    1
    感觉他这句话已经说到位了啊。
    binux
    binux
    May 30, 2017❤️2
    2
    他说得很明白了啊,__version__ 这样的名称太过于常见了,它更适合看作是 module.__version__ 的一个属性,而不是单独的变量。所以 import module, 然后 module.__version__ 是合适的。
    但是,如果是一个特定的类,例如 from collections import OrderedDict,OrderedDict 可以独立使用的类,那么 from...import 并没有问题。
    twitterpig
    twitterpig
    OP
    May 30, 2017
    3
    @binux 表示明白了很多~谢谢~
    halfcoder
    halfcoder
    May 30, 2017❤️2
    4
    应该是不推荐使用 from ... import * 语句吧?
    TJT
    TJT
    May 30, 2017
    5
    @halfcoder 这个倒挺有用的,可以通过 __all__ 来限制 from ... import * 导入的东西,很多库都会用到。
    NoAnyLove
    NoAnyLove
    May 31, 2017
    6
    《 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
    xiaket
    May 31, 2017
    7
    from xyz import abcd, efgh 这么一下子进来了两个或多个名字. 如果这些个名字都不是很广为人知的话,是更容易引起名称冲突的.
    PythonAnswer
    PythonAnswer
    May 31, 2017 via Android
    8
    from 没有不建议使用。只是不建议用*。
    Django 系非常喜欢用 from。
    zhengxiaowai
    zhengxiaowai
    May 31, 2017
    9
    在不同的书中推荐的也不一样。总结来看是这样子的

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

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

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

    __all__ 的作用就是用来重写 `import *` 的行为,可以用来隐藏 public property, 也可以暴露 private property.
    yanzixuan
    yanzixuan
    May 31, 2017
    14
    @zhengxiaowai 忘了哪本书说的了,import 限定了字典查找的范围,资源消耗少。如果全部搞一起,查起来费力了。
    shawndev
    shawndev
    Jun 5, 2017
    15
    不建议 from ... import * 吧,看过这个说法,主要是为了防止命名冲突
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   706 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 23:28 · PVG 07:28 · LAX 15:28 · JFK 18:28
    ♥ Do have faith in what you're doing.