Python按文件夹模块导入

时间:2010-06-12 01:05:59

标签: python import

我有一个目录结构:

example.py
templates/
    __init__.py
    a.py
    b.py

a.pyb.py只有一个类,名称与文件相同(因为它们是猎豹模板)。出于纯粹的样式原因,我希望能够在example.py中导入和使用这些类,如下所示:

import templates

t = templates.a()

现在,我在模板文件夹的__init__.py

中进行此操作
__all__ = ["a", "b"]
from . import *

然而,这似乎很差(也许是多余的),甚至没有做我想要的,因为我必须使用这样的类:

t = templates.a.a()

思想?

3 个答案:

答案 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)在这种特殊情况下它也避免了事故(例如,一些子模块)可能会定义一个名称thismodmodnames ...所以将我们在循环中使用的那些名称保留在函数的本地,不是模块全局变量是很重要的,所以他们不会被意外践踏; - )。

如果要强制执行名为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 *