依赖注入的类型提示

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

我正在创建一个声明式 http 客户端,但 mypy linting 存在问题。

错误:

Incompatible default for argument "user" (default has type "Json", argument has type "dict\[Any, Any\]")

我有一个“依赖”类,它实现以下逻辑:针对类型进行值验证,请求修改:

class Dependency(abc.ABC):
    def __init__(
        self,
        default: Any = Empty,
        field_name: Union[str, None] = None,
    ):
        self.default = default
        self._overridden_field_name = field_name

    ...

    @abc.abstractmethod
    def modify_request(self, request: RawRequest) -> RawRequest:
        raise NotImplementedError

Dependency
继承的依赖项,例如杰森:

class Json(Dependency):
    location = Location.json

    def __init__(self, default: Any = Empty):
        """Field name is unused for Json."""
        super().__init__(default=default)

    def modify_request(self, request: "RawRequest") -> "RawRequest":
        ...
        return request

然后我使用它们作为函数参数的默认值来声明:

@http("GET", "/example")
def test_get(data: dict = Json()):
    ...

它按预期工作,但 mypy 引发了很多错误。

问题 - 如何处理类型提示?

我需要它像 FastAPI 中的 Query() 或 Body() 一样工作,而不改变声明方式。

我尝试使依赖类成为通用的,但这对我没有帮助。

更新:

抱歉,忘记提及类型提示可以是数据类、pydantic 模型或任何其他类型。然后在函数执行时会被反序列化。

python python-3.x mypy python-typing
1个回答
1
投票

您遇到的问题是由于类型提示与默认值的类型不匹配。函数

test_get
需要一个
dict
类型的参数数据,但您提供的默认值是 Json 类型,它是 Dependency 的子类。

看这里:

class Json(Dependency):

您需要确保您的

Json
类可以充当字典,除了
Dependency

之外,您还可以通过继承 dict 来实现此目的
class Json(Dependency, dict):
    location = Location.json

    def __init__(self, default: Any = Empty):
        """Field name is unused for Json."""
        super().__init__(default=default)

    def modify_request(self, request: "RawRequest") -> "RawRequest":
        ...
        return request

你也可以自己实现所有的字典模拟方法,但这有点复杂。

© www.soinside.com 2019 - 2024. All rights reserved.