mypy说request.json返回Optional[Any],我该如何解决?

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

我正在尝试更好地理解 mypy。对于以下代码行:

request_body: dict = {}
request_body = request.get_json()

mypy 返回错误:

error: Incompatible types in assignment (expression has type "Optional[Any]", variable has type "Dict[Any, Any]")

这个问题的正确解决方法是什么?

python mypy
2个回答
3
投票

正如您在以下代码中看到的,取自 /wekzeug/wrappers/request.py,函数

get_json
并不总是返回字典。我建议从变量中删除类型提示,因为它可以是 None 或字典。

def get_json(
        self, force: bool = False, silent: bool = False, cache: bool = True
    ) -> t.Optional[t.Any]:
        """Parse :attr:`data` as JSON.

        If the mimetype does not indicate JSON
        (:mimetype:`application/json`, see :meth:`is_json`), this
        returns ``None``.

        If parsing fails, :meth:`on_json_loading_failed` is called and
        its return value is used as the return value.

        :param force: Ignore the mimetype and always try to parse JSON.
        :param silent: Silence parsing errors and return ``None``
            instead.
        :param cache: Store the parsed JSON to return for subsequent
            calls.
        """
        if cache and self._cached_json[silent] is not Ellipsis:
            return self._cached_json[silent]

        if not (force or self.is_json):
            return None

        data = self.get_data(cache=cache)

        try:
            rv = self.json_module.loads(data)
        except ValueError as e:
            if silent:
                rv = None

                if cache:
                    normal_rv, _ = self._cached_json
                    self._cached_json = (normal_rv, rv)
            else:
                rv = self.on_json_loading_failed(e)

                if cache:
                    _, silent_rv = self._cached_json
                    self._cached_json = (rv, silent_rv)
        else:
            if cache:
                self._cached_json = (rv, rv)

        return rv

这一行专门导致该方法返回 None:

except ValueError as e:
    if silent:
        rv = None

1
投票

我所做的是为方法创建一个包装器

request.json
以确保我总是得到一个字典。

def validate_and_get_json():
    if not request.json:
        raise Exception("Invalid format")

    return request.json
© www.soinside.com 2019 - 2024. All rights reserved.