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
pyKun
V2EX  ›  Python

submodule import 的时候,在什么情况下必须必须在 __init__ 里加上?

  •  
  •   pyKun · 2014-08-15 10:09:46 +08:00 · 3218 次点击
    这是一个创建于 3751 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,目录如下:
    foo/
    __init__.py
    bar/
    __init__.py
    xxx
    yyy

    import foo 后
    foo.bar 木有,想到的在 foo 的 __init__.py 下加一个 import bar 就可以了,但是大多数情况 __init__.py 是空的也可以吧
    所以,如何自动的让 foo import 他的submodule bar?什么时候必须在 __init__.py 里加?
    9 条回复    2014-09-05 16:56:15 +08:00
    mengzhuo
        1
    mengzhuo  
       2014-08-15 11:00:21 +08:00
    这个需求貌似违反了Python的明确比隐晦好的标准……
    __init__里一般不是空的,有作者、版本、授权方式之类的东西
    pyKun
        2
    pyKun  
    OP
       2014-08-15 11:52:03 +08:00
    @mengzhuo
    我指的除了这些是空的。。
    totoismi
        3
    totoismi  
       2014-08-15 12:17:06 +08:00
    __init__.py 为空,如果仅仅导入包,基本什么都做不了的
    no13bus
        4
    no13bus  
       2014-08-15 12:43:44 +08:00
    ```python
    import bar
    __all__ = ['bar']
    ```
    all是明确你需要导入哪些东西,python建议你写,不然的话 python会把所有东西都导入的。不明确
    pyKun
        5
    pyKun  
    OP
       2014-08-15 12:50:10 +08:00
    @no13bus

    写成docstring么?我直接import bar和这个有啥区别么?
    no13bus
        6
    no13bus  
       2014-08-15 14:45:19 +08:00
    @pyKun sorry 我以为现在v2ex已经支持mrkdown了呢。实际代码是这样的。写到foo的init里面。

    import bar,bar1,bar2
    __all__ = ['bar']

    那么你在from foo import *的时候 只能导入bar。 bar1 bar2都不能导入。__all__的意思就是让你对模块内的接口进行限制 以免默认情况下导入了一些变量 会对程序造成污染。
    pyKun
        7
    pyKun  
    OP
       2014-08-15 14:53:22 +08:00
    @no13bus
    这个明白,我现在环境也是这么解决的,但是我奇怪的是另一个module,同样情况,在 __init__.py 除了声明,license什么也没有,但是那个就能找到对应的 foo.bar
    pyKun
        8
    pyKun  
    OP
       2014-09-05 15:15:05 +08:00
    @mengzhuo
    @totoismi
    @no13bus

    最近有碰巧发现在开说说的那种情况下,from foo import bar 是可以的,所以猜下,应该是:

    1. foo.bar 会去找 foo.__all__
    2. from foo import bar 的时候先是通过 pythonpath 找到 foo,也就是一个目录,这个时候import bar,pythonpath 自然就包括了本地,即 ‘.’ 所以 from foo import bar 是可以的

    这个是猜的,还没查询代码验证
    totoismi
        9
    totoismi  
       2014-09-05 16:56:15 +08:00
    是的,按照你的代码结构,from foo import bar是可以的。但是import foo后foo.bar是找不到bar的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:40 · PVG 08:40 · LAX 16:40 · JFK 19:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.