python - 如何将 python 类型注释添加到 flask 全局上下文 g?

标签 python flask mypy python-typing pyright

我有一个装饰器,它将用户添加到 flask 全局上下文 g 中:

class User:
    def __init__(self, user_data) -> None:
        self.username: str = user_data["username"]
        self.email: str = user_data["email"]

def login_required(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        user_data = get_user_data()
        user = User(user_data)
        g.user = User(user_data)

        return f(*args, **kwargs)

    return wrap

当我在 Controller 中访问 g.user 时,我希望知道 g.user 的类型(用户)。我怎样才能做到这一点? (我正在使用 pyright)

最佳答案

我遇到了 Typechecking dynamically added attributes 中描述的类似问题.一种解决方案是使用 typing.TYPE_CHECKING 添加自定义类型提示。 :

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from flask.ctx import _AppCtxGlobals

    class MyGlobals(_AppCtxGlobals):
        user: 'User'

    g = MyGlobals()
else:
    from flask import g
现在例如
reveal_type(g.user)
会发出
note: Revealed type is 'myapp.User'
如果自定义类型应该在多个模块中重用,您可以为 flask 引入部分 stub 。 . stub 的位置取决于类型检查器,例如mypyMYPY_PATH 读取自定义 stub 环境变量,pyright寻找 typings项目根目录等中的目录。部分 stub 的示例:
# _typeshed/flask/__init__.pyi

from typing import Any
from flask.ctx import _AppCtxGlobals
from models import User


def __getattr__(name: str) -> Any: ...  # incomplete


class MyGlobals(_AppCtxGlobals):
    user: User
    def __getattr__(self, name: str) -> Any: ...  # incomplete


g: MyGlobals

关于python - 如何将 python 类型注释添加到 flask 全局上下文 g?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60123011/

相关文章:

python - 将泛型子类的类型推断为将自身作为类型

python - 如何对字典进行子类化,使其支持通用类型提示?

python - 使用python替换字符串中字符的所有实例

python - 从列表字典创建 n 个嵌套循环

python - Linux 下的 PyInstaller 和 NumPy

python - 范围规则的简短描述?

python - 返回 send_file 的端点不再被调用

python - Legenda 或 mypy html 报告的文档?

python - 在 Flask 应用程序中返回 Excel 文件

python - 蓝图的蓝图(Flask)