gpt4 book ai didi

Python 合格的导入全部在包中

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:18 25 4
gpt4 key购买 nike

好吧,我有一个包含站点各个页面的 Controller 的文件。让我们说以下结构。

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

我知道您可以使用 __init__.py 中的片段动态加载文件夹 Controller 中的所有已定义符号。 :

__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)

问题是,我确实喜欢合格的进口产品。假设每个 Controller 文件都定义了一个 Controller 函数。有什么方法可以实现 __init__.py 的行为神奇的是,当我这样做时:

import controllers

我可以将这些函数称为

controllers.controller_function_name()

而不是:

controllers.module_name.controller_function_name()

?去掉中间人。本质上,让它表现得就像一个模块一样。

有什么办法可以做到这一点吗?

最佳答案

如果我理解正确的话,你的代码已经可以让你做你想做的事情了。

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

__all__ 仅影响使用 from module import * 时导入的内容。通过修改 __all__,您会影响 fromcontrollers import * 时会发生的情况,但不会影响 controllers 下可用的内容> 如果你只是导入 Controller

关于Python 合格的导入全部在包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22209564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com