Python Qualified Import in Package

时间:2014-03-05 21:21:20

标签: python packages web-frameworks

好吧,所以我有一个带有控制器的文件,用于网站的各个页面。让我们说以下结构。

/controllers
    /login_controller.py
    /main_controller.py
    /and_so_forth

我知道您可以使用__init__.py中的剪辑动态加载文件夹控制器中的所有已定义符号:

__all__ = []

import pkgutil
import inspect

for loader, name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(name).load_module(name)

    for name, value in inspect.getmembers(module):
        if name.startswith('__'):
            continue

        globals()[name] = value
        __all__.append(name)

问题是,我确实喜欢合格的进口产品。所以说每个控制器文件都定义了一个控制器功能。是否有任何方法可以实现__init__.py魔法的行为,以便在我做的时候:

import controllers

我可以将这些功能称为

controllers.controller_function_name()

而不是:

controllers.module_name.controller_function_name()

?去掉中间人。从本质上讲,让它表现得好像它只是一个模块。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

如果我理解你的话,你的代码已经让你做你想做的事了。

执行globals()[name] = value时,可以在__init__.py中创建一个全局变量。 __init__.py中的全局变量决定了包名称空间下的可用内容。因此,如果在您的代码中最终在some_controller中创建变量__init__.py,那么您将能够controllers.some_controller

__all__仅影响您使用from module import *时导入的内容。通过修改__all__,您正在影响from controllers import *会发生什么,但如果您controllers import controllers,则不会影响{{1}}下可用的内容