gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:13:03 24 4
gpt4 key购买 nike

我有一个装饰器,它将用户添加到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com