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

2014-08-15 10:09:46 +08:00
 pyKun
比如,目录如下:
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 里加?
3057 次点击
所在节点    Python
9 条回复
mengzhuo
2014-08-15 11:00:21 +08:00
这个需求貌似违反了Python的明确比隐晦好的标准……
__init__里一般不是空的,有作者、版本、授权方式之类的东西
pyKun
2014-08-15 11:52:03 +08:00
@mengzhuo
我指的除了这些是空的。。
totoismi
2014-08-15 12:17:06 +08:00
__init__.py 为空,如果仅仅导入包,基本什么都做不了的
no13bus
2014-08-15 12:43:44 +08:00
```python
import bar
__all__ = ['bar']
```
all是明确你需要导入哪些东西,python建议你写,不然的话 python会把所有东西都导入的。不明确
pyKun
2014-08-15 12:50:10 +08:00
@no13bus

写成docstring么?我直接import bar和这个有啥区别么?
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
2014-08-15 14:53:22 +08:00
@no13bus
这个明白,我现在环境也是这么解决的,但是我奇怪的是另一个module,同样情况,在 __init__.py 除了声明,license什么也没有,但是那个就能找到对应的 foo.bar
pyKun
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
2014-09-05 16:56:15 +08:00
是的,按照你的代码结构,from foo import bar是可以的。但是import foo后foo.bar是找不到bar的。

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

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

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

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

© 2021 V2EX