好吧,所以我有一个带有控制器的文件,用于网站的各个页面。让我们说以下结构。
/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()
?去掉中间人。从本质上讲,让它表现得好像它只是一个模块。
有没有办法做到这一点?
答案 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}}下可用的内容