我在金字塔项目目录中创建了一个名为“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?
答案 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文件。
对不起。