导入模块的 Python 类型提示

Posted

技术标签:

【中文标题】导入模块的 Python 类型提示【英文标题】:Python type hinting on imported Flask modules 【发布时间】:2019-04-12 19:12:28 【问题描述】:

我发现 Flask 的自动完成功能有些欠缺——这是因为在内部,特定于上下文的对象,例如 current_apprequestlogger,实际上是 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 中的应用程序上下文中获取正确的类型提示?

【问题讨论】:

maybe it will be useful Flask 仅在 Pycharm 专业版中支持 jetbrains.com/help/pycharm/flask.html 你使用的是哪个版本的 Pycharm:社区版还是专业版? 我使用社区版(不知道对特定库的专门支持),但这个问题一般是针对那些在运行时将类型组合在一起的糟糕库(例如 Boto3)编写的。跨度> 续:以 Flask 为例,它只是最新的、使用最广泛的,并且有可能是最简单的问题和解决方法。 对于那些寻找 Flask 替代品的人,我建议使用 FastAPI,它是完全类型注释的。 【参考方案1】:

你试过了吗?我知道它至少在从其他模块导入普通变量时有效。

# in module_a.py
my_str = 23


# in module_b.py
from module_a import my_str

my_str: str

# The IDE should now suggest string methods when trying to access
# properties of `my_str`

【讨论】:

以上是关于导入模块的 Python 类型提示的主要内容,如果未能解决你的问题,请参考以下文章

python中模块包无法导入import问题

模块简介模块的两种导入语句导入文件的补充判断文件类型模块的查找顺序

Python模块化

python模块的导入以及模块简介

python的包和模块

python的包和模块