我正在创建一个声明式 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 模型或任何其他类型。然后在函数执行时会被反序列化。
您遇到的问题是由于类型提示与默认值的类型不匹配。函数
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
你也可以自己实现所有的字典模拟方法,但这有点复杂。