加载模块以调用其装饰器

时间:2017-11-16 16:06:01

标签: python python-3.x python-import python-decorators

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

摘自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]')装饰器未运行,我的Web应用程序将失败并显示相应路由不可用的消息。

在这种情况下运行webapp.service中的代码以“运行”装饰器的最佳做法是什么?我真的不需要导入模块本身或其任何成员。

1 个答案:

答案 0 :(得分:1)

如问题评论中所述, 你只需要导入模块。对于linter投诉,那些是你的问题中较小的一个。 Linters可以提供帮助 - 如果他们遇到困难,就不要听他们说。

因此,只有在__main__.py__init__.py结束时,根据您的应用结构,简单地导入所有使用查看装饰。

如果您有一个linter,请检查如何在导入行上将其静音 - 这通常通过对导入行的特殊注释来完成。

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

在主模块上调用它