3

我在金字塔项目目录中创建了一个名为“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

在模型/初始化.py 中?

4

3 回答 3

3

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

from User import User
from Group import Group

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

一句忠告:标准做法是使用所有小写的模块名称并为类保留大写字母。这允许您同时在同一个命名空间中拥有user模块和类,如果模块包含使用类的便利函数,这将很方便。User

于 2012-09-10T04:48:10.720 回答
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' ]
于 2012-09-10T07:23:37.480 回答
0

不幸的是,如果不导入模型/__init__.py,就没有任何方法可以满足您的要求。或者,将所有模型包含在一个 .py 文件中,而不是为每个模型创建一个单独的 .py 文件。

对不起。

于 2012-09-10T03:12:40.700 回答