【发布时间】:2019-04-12 19:12:28
【问题描述】:
我发现 Flask 的自动完成功能有些欠缺——这是因为在内部,特定于上下文的对象,例如 current_app、request 和 logger,实际上是 LocalProxys。因此 PyCharm 不知道如何处理这种类型。
因此,对我来说,显而易见的解决方案是在导入的模块上应用类型提示。除非你不能那样做!从 Python 3.7 开始,似乎没有这样的语法来促进这一点。
因此,下一个显而易见的解决方案是制作每个特定于上下文的模块的本地副本,其类型明确设置如下:
from logging import Logger
from flask import Flask, Request, Blueprint, request, current_app as app
app: Flask = app
logger: Logger = app.logger
request: Request = request
...在您真正尝试启动服务器之前一直有效,在这种情况下,应用程序会因为 RuntimeError: Working outside of application context. 而崩溃
事实证明,我们实际上可以将相关的类型提示封装在应用程序上下文中的类或其他范围内。
@foo_blueprint.route('/foo', methods=['GET'])
def foo(cls):
_app: Flask = app
_logger: Logger = app.logger
_request: Request = request
# ...
...这有效,但在任何可以想象的意义上都令人难以置信的尴尬。
是否有合理的解决方案可以在 Flask 中的应用程序上下文中获取正确的类型提示?
【问题讨论】:
-
Flask 仅在 Pycharm 专业版中支持 jetbrains.com/help/pycharm/flask.html 你使用的是哪个版本的 Pycharm:社区版还是专业版?
-
我使用社区版(不知道对特定库的专门支持),但这个问题一般是针对那些在运行时将类型组合在一起的糟糕库(例如 Boto3)编写的。跨度>
-
续:以 Flask 为例,它只是最新的、使用最广泛的,并且有可能是最简单的问题和解决方法。
-
对于那些寻找 Flask 替代品的人,我建议使用 FastAPI,它是完全类型注释的。
标签: python flask pycharm type-hinting python-3.7