我有一个装饰器,它将用户添加到 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 的位置取决于类型检查器,例如mypy
从 MYPY_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/