加载模块以调用其装饰器
Load module to invoke its 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
中的代码 "run" 装饰器 运行 的最佳做法是什么?我真的不需要导入模块本身或其任何成员。
正如问题的评论中所述,
您只需导入模块。至于 linter 投诉,这些是您的问题中较小的一个。 Linter 可以提供帮助 - 如果他们挡路,请不要听他们的。
所以,让你的东西正常工作的简单方法是,在你的 __main__.py
或 __init__.py
的末尾,根据你的应用程序结构,显式导入所有使用的模块视图装饰器。
如果您有 linter,请检查如何在导入行中将其静音 - 这通常通过在导入行中添加特殊注释来完成。
Python 的内省很棒,但它找不到 class 或子 class 的实例,如果它们是在未导入的模块中定义的: 这样的模块只是一个位于磁盘上的文本文件,就像任何数据文件一样。
一些框架提供的一种方法是拥有一个 "discovery" 实用程序,它将静默导入项目文件夹中的所有 "py" 文件。这样您的视图就可以 "come into existence" 而无需显式导入。
您可以使用如下函数:
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__)
调用它
我有一个程序由几个模块组成,其中指定了相应的 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
中的代码 "run" 装饰器 运行 的最佳做法是什么?我真的不需要导入模块本身或其任何成员。
正如问题的评论中所述, 您只需导入模块。至于 linter 投诉,这些是您的问题中较小的一个。 Linter 可以提供帮助 - 如果他们挡路,请不要听他们的。
所以,让你的东西正常工作的简单方法是,在你的 __main__.py
或 __init__.py
的末尾,根据你的应用程序结构,显式导入所有使用的模块视图装饰器。
如果您有 linter,请检查如何在导入行中将其静音 - 这通常通过在导入行中添加特殊注释来完成。
Python 的内省很棒,但它找不到 class 或子 class 的实例,如果它们是在未导入的模块中定义的: 这样的模块只是一个位于磁盘上的文本文件,就像任何数据文件一样。
一些框架提供的一种方法是拥有一个 "discovery" 实用程序,它将静默导入项目文件夹中的所有 "py" 文件。这样您的视图就可以 "come into existence" 而无需显式导入。
您可以使用如下函数:
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__)