从__init__.py在Python中导入文件
假设我有以下的结构:
app/
__init__.py
foo/
a.py
b.py
c.py
__init__.py
a.py、b.py 和 c.py 这几个文件里有一些共同的导入(比如 logging、os、re 等等)。我能不能从 __init__.py
文件里导入这三到四个共同的模块,这样我就不需要在每个文件里都导入它们了?
补充说明:我的目标是避免在每个文件里都导入 5-6 个模块,这和性能没有关系。
3 个回答
6
是的,但别这么做。真的,别这样做。不过如果你还是想知道怎么做,那大概是这样的:
import __init__
re = __init__.re
logging = __init__.logging
os = __init__.os
我之所以说别这么做,不仅因为这样做很乱也没什么意义,还因为你的包其实不应该这样使用__init__.py
。这个文件是用来初始化包的代码。
14
你可以使用一个常见的文件,比如 include.py
,来实现这个功能,但这样做不太符合推荐的做法,因为它涉及到通配符导入。我们来看一下以下的文件:
app/
__init__.py
foo/
a.py
b.py
c.py
include.py <- put the includes here.
__init__.py
现在,在 a.py
等文件中,你可以这样做:
from include import *
正如上面所说的,这种做法不推荐,因为通配符导入是不被鼓励的。
11
不,日志功能必须放在每个模块的命名空间里,所以你得以某种方式导入它们(除非你把logging
当作函数参数传递,这样做就有点奇怪了,至少可以这么说)。
不过,模块其实只会被导入一次(然后放到a
、b
和c
的命名空间里),所以不用担心会占用太多内存之类的问题。
当然,你可以把它们放到一个单独的模块里,然后把这个模块导入到每个a
、b
和c
里,但这个单独的模块每次还是得导入。