我正在使用Django,我喜欢将我的模型,视图和测试分成子目录。
但是,这意味着我需要在每个导入该目录中每个模块的子目录中维护一个__init__.py
。
我只是打电话说:
from some_library import import_everything
import_everything()
这与迭代当前目录并导入该目录中的每个.py文件具有相同的效果。
实现此目的的最佳/最简单方法是什么?
以下是我的django应用程序目录(基本上)的样子:
some_django_app/
models/
__init__.py
create.py
read.py
update.py
delete.py
views/
__init__.py
create.py
read.py
update.py
delete.py
forms/
__init__.py
create.py
update.py
tests/
__init__.py
create.py
read.py
update.py
delete.py
所以,你可以看到制作一个正确的" Django app,我所有的 init .py文件都需要导入每个目录中的所有其他.py文件。我宁愿在那里有一些简单的样板。
答案 0 :(得分:4)
在app/models/__init__.py
中添加以下行:
from app.models.create import *
from app.models.read import *
from app.models.update import *
from app.models.delete import *
这对于简洁和可读性来说是最好的选择。 from app.models import *
现在将从每个其他文件中加载所有类/ etc。同样,无论from app.models import foo
中定义了哪些文件,foo
都会加载{{1}}。
答案 1 :(得分:1)
使用synthesizerpatel's answer中提供的信息,您可以通过以下方式实施import_everything
:
import os
import sys
def import_everything(path):
# Insert near the beginning so path will be the item removed with sys.path.remove(path) below
# (The case when sys.path[0] == path works fine too).
# Do not insert at index 0 since sys.path[0] may have a special meaning
sys.path.insert(1,path)
for filename in os.listdir(path):
if filename.endswith('.py'):
modname = filename.replace('.py', '')
module = __import__(modname, fromlist = [True])
attrs = getattr(module, '__all__',
(attr for attr in dir(module) if not attr.startswith('_')))
for attr in attrs:
# print('Adding {a}'.format(a = attr))
globals()[attr] = getattr(module, attr)
sys.path.remove(path)
可以像这样使用:
print(globals().keys())
# ['import_everything', '__builtins__', '__file__', '__package__', 'sys', '__name__', 'os', '__doc__']
import_everything(os.path.expanduser('~/test'))
print(globals().keys())
# ['hashlib', 'pythonrc', 'import_everything', '__builtins__', 'get_input', '__file__', '__package__', 'sys', 'mp', 'time', 'home', '__name__', 'main', 'os', '__doc__', 'user']