在Python中实现“from。import *”的最佳方法是什么?

时间:2012-01-30 18:45:47

标签: python django

我正在使用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文件。我宁愿在那里有一些简单的样板。

2 个答案:

答案 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']