加载模块调用它的装饰(Load module to invoke its decorators)

2019-09-28 21:46发布

我有几个模块指定相应的Web应用程序处理程序和一个,指定相应的路由器的程序consistring。
我使用的库可以找到这里 。

摘自webapp.service (有多个这样的模块):

from webapp.router import ROUTER

@ROUTER.route('/service/[id:int]')
class ServicePermissions(AuthenticatedService):
    """Handles service permissions."""

    NODE = 'services'
    NAME = 'services manager'
    DESCRIPTION = 'Manages services permissions'
    PROMOTE = False

webapp.router

ROUTER = Router()

当我导入webapp.router模块,该webapp.service模块也显然无法运行。 因此, @ROUTER.route('/service/[id:int]')装饰器不会运行,我的网页aplication将失败,并显示消息,相应的路由不可。

什么是在这种情况下,最好的做法来运行代码webapp.service “跑”的装饰? 我并不真的需要导入模块本身或者它的任何成员。

Answer 1:

作为FOT问题的评论说,你只需要导入模块。 至于棉短绒投诉,这些都是你的问题的较少。 棉短绒在那里帮助 - 如果他们进入的方式,就是不听他们的。

因此,简单的方法只是为了让你的东西的工作就是,在你结束__main__.py__init__.py ,这取决于你的应用程序结构,明确导入所有利用视图修饰的模块。

如果你有一个棉短绒,检查有沉默它的进口线 - 这通常是与进口线一种特殊的注释来完成。

Python的自省是太棒了,但它无法找到一个类或子类的实例,如果这些都是在没有导入模块中定义:这样的模块只是一个文本文件坐在磁盘上,就像任何数据文件。

什么是一些框架提供作为一种方法是有一个“发现”实用工具,将默默地导入项目文件夹中的所有“PY”的文件。 这样,你的意见,可以“进入存在”没有明确的进口。

你可以使用类似功能:

import os

def discover(caller_file):
    caller_folder = os.path.dirname(caller_file)
    for current, folders, files in os.walk(caller_folder):
        if current == "__pycache__":
            continue
        for file in files:
            if file.endswith(".py"):
                __import__(os.path.join(current, file))

并与调用它的主模块上discover(__file__)



文章来源: Load module to invoke its decorators