如何在金字塔中导入它们时缩短路径?

时间:2012-09-10 02:42:03

标签: python pyramid

我在金字塔项目目录中创建了一个名为“models”的文件夹,并将我的所有模型放在单独的文件中,例如:

models
  |------ User.py
            |------- class User
  |------ Group.py
            |------- class Group

在像initializedb.py这样的一些脚本中,我必须编写类似

的内容
from ..models.User import User
from ..models.Group import Group

非常难看。如何缩短他们

from ..models import User
from ..models import Group

没有添加像

这样的冗余
from .User import User
from .Group import Group

在models / init .py?

3 个答案:

答案 0 :(得分:3)

唯一的方法是通过models/__init__.py

from User import User
from Group import Group

这会将models变成一个包,并允许您使用from ..models import User

一句忠告:标准做法是拥有所有低级的模块名称和类的保留大写。这允许您同时在同一名称空间中同时拥有user模块和User类,如果模块包含用于处理类的便捷函数,则可以很方便。

答案 1 :(得分:3)

这是一个粗略的&你可能如何自动化它的一个肮脏的例子。使用以下内容创建__init__.py

import os
import sys
import glob
import pkgutil

def auto_importer():
    here = os.path.split(__file__)[0]
    for _, package, _ in pkgutil.iter_modules( [here] ):
        package_name = '%s.%s' % (here, package)
        if package_name not in sys.modules:
            __import__( package_name )
            module = sys.modules[package_name]
            public_members = (m for m in getattr(module, '__all__', dir(module)) if not m.startswith('__'))
            for member in public_members:
                globals()[member] = getattr(module, member)

auto_importer()

# clean up namespace to avoid these leaking out
del os, sys, glob, pkgutil
del auto_importer

这将导入每个包含模块的所有内容,这些模块没有__的前缀(因此我们不会从每个模块中提取所有特殊属性,例如__file__)。如果您只想导入Group模块中的group课程,则需要在group.py添加一行,如下所示:

__all__ = [ 'Group' ]

答案 2 :(得分:0)

不幸的是,如果没有在models / __ init__.py中导入,没有办法做你要求的事情。或者,将所有模型包含在单个.py文件中,而不是单独的.py文件。

对不起。