我有一个目录结构:
example.py
templates/
__init__.py
a.py
b.py
a.py
和b.py
只有一个类,名称与文件相同(因为它们是猎豹模板)。出于纯粹的样式原因,我希望能够在example.py
中导入和使用这些类,如下所示:
import templates
t = templates.a()
现在,我在模板文件夹的__init__.py
:
__all__ = ["a", "b"]
from . import *
然而,这似乎很差(也许是多余的),甚至没有做我想要的,因为我必须使用这样的类:
t = templates.a.a()
思想?
答案 0 :(得分:4)
为避免重复from <whatever> import *
25次,您需要一个循环,例如:
import sys
def _allimports(modnames)
thismod = sys.modules[__name__]
for modname in modnames:
submodname = '%s.%s' % (thismod, modname)
__import__(submodname)
submod = sys.modules[submodname]
thismod.__dict__.update(submod.__dict__)
_allimports('a b c d e'.split()) # or whatever
我将有意义的代码放在一个函数中,因为(a)它总是最好[[用于表现并避免污染模块的命名空间]],(b)在这种特殊情况下它也避免了事故(例如,一些子模块)可能会定义一个名称thismod
或modnames
...所以将我们在循环中使用的那些名称保留在函数的本地,不是模块全局变量是很重要的,所以他们不会被意外践踏; - )。
如果要强制执行名为modname
的模块只有一个具有相同名称的类(或其他全局)的事实,请将循环的最后一个语句更改为:
setattr(thismod, modname, getattr(submod, modname))
答案 1 :(得分:3)
在__init__.py
:
from a import *
from b import *
现在a
的所有内容都在templates
中,b
的所有内容也都在。{/ p>
答案 2 :(得分:3)
我甚至不知道你可以拥有from . import *
。我的python解释器抱怨这样的声明。不过,对于你的问题,你可以这样做:
# __init__.py
from . import a, b
a = a.a
b = a.b
您现在可以使用
# example.py
import templates
t = templates.a()
其他解决方案:
# __init__.py
from a import *
from b import *