Python按文件夹modu导入

2024-06-18 13:12:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个目录结构:

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

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

^{pr2}$

现在,我在模板文件夹的__init__.py中创建这个文件:

__all__ = ["a", "b"]
from . import *

然而,这看起来很糟糕(可能是多余的),甚至不能实现我想要的,因为我必须使用这样的类:

t = templates.a.a()

有什么想法?在


Tags: 文件py目录文件夹模板initexample原因
3条回答

在您的__init__.py中:

from a import *
from b import *

现在a的所有内容都将在templates中,所有{}的内容也都将位于templates中。在

我甚至不知道你能得到from . import *。我的python解释器会抱怨这样的语句。不过,对于您的问题,您可以:

# __init__.py
from . import a, b
a = a.a
b = a.b

你现在可以使用

^{pr2}$

其他解决方案:

# __init__.py
from a import *
from b import *

为了避免重复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或{}。。。因此,重要的是要将我们在循环中使用的那些名称保留在函数的本地,而不是模块全局变量,这样它们就不会被意外践踏;-)。在

如果要强制一个名为modname的模块只有一个同名的类(或其他全局类),请将循环的最后一个语句更改为:

^{pr2}$

相关问题 更多 >