如何向 Python Flask 和 Marshmallow 添加类型推断

问题描述 投票:0回答:1

我是来自 Typescript 背景的 Python 新手。组合 Flask API 服务器并使用 Marshmallow 验证输入 DTO。

如何让 VSCode 从 Marshmallow Schema 加载中推断类型?

class PostInput:
    myString = fields.Str(
        required=True
    )

@app.route('/foo', methods=['POST'])
def post_foo():
    try:
        data = PostInput().load(request.json)
    except ValidationError as err:
        return jsonify(err.messages), 400
      
    myString = data.get("myString")

    myString <== I want this to be known as a str
python python-typing marshmallow pyright
1个回答
0
投票

为 dict 键添加输入提示:

from marshmallow import fields, Schema

class PostInput(Schema):
    myString = fields.Str(
        required=True
    )
    
json = '{"myString": "hello"}'
data = PostInput().loads(json, many=False)
myString:str = data.get("myString")

或将数据序列化到数据类中:


from marshmallow import fields, Schema, post_load
from dataclasses import dataclass

@dataclass
class InputClass:
    myString: str


class PostInput(Schema):
    myString = fields.Str(
        required=True
    )
    @post_load
    def make_user(self, data, **kwargs) -> InputClass:
        return InputClass(**data)
        
    
json = '{"myString": "hello"}'
data: InputClass = PostInput().loads(json, many=False)
myString = data.myString

我建议使用 pydantic 进行验证和加载 json。它既验证数据又创建像继承属性类型的数据类一样的东西:

from pydantic import BaseModel, Field

class PostInput(BaseModel):
    myString: str = Field(required=True)    

json = '{"myString": "hello"}'
data = PostInput.model_validate_json(json)
myString = data.myString
© www.soinside.com 2019 - 2024. All rights reserved.