Python 类型检查无法识别文档字符串中的类型信息

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

我正在使用一个名为 client_aiohttp 的内部库,它是使用 openapi-generator/python-aiohttp 生成的。

例如,这里是 Clusters 类中的 add_hosts 方法:

# client_aiohttp/api/clusters.py
class Clusters:
  def add_hosts(self, cluster_name, **kwargs):  # noqa: E501
      """add_hosts  # noqa: E501

      A human readable description

      :param cluster_name: (required)
      :type cluster_name: str
      :param body:
      :type body: ApiHostRefList
      :param async_req: Whether to execute the request asynchronously.
      :type async_req: bool, optional
      :return: Returns the result object.
      :rtype: ApiHostRefList
      """
      return self.add_hosts_with_http_info(cluster_name, **kwargs)  # noqa: E501

但是,vscode python 语言服务器(pylance)和 mypy 似乎无法识别文档字符串中指定的类型信息。

我尝试寻找可以从文档字符串生成 .pyi 存根文件或启用文档字符串评估的工具或选项,但我还没有找到。

如何使类型检查器识别文档字符串中指定的类型信息以进行正确的类型检查?

python python-typing aiohttp openapi-generator docstring
1个回答
0
投票

所以有一个名为 doc484 的包,它可以生成这样的类型提示:

def read_status(self, cluster_name, service_name, **kwargs):  # noqa: E501
  # type: (str, str, **Any) -> ApiStatusList

但是,返回类型几乎从未导入到文件中,因此我编写了一个 bash 脚本来在行开头导入所有内容。

line_to_insert="from client_aiohttp import *"
for file in *.py; do
    temp_file=$(mktemp)
    awk -v new_line="$line_to_insert" 'NR==1 {print} NR==2 {print new_line} NR>2 {print}' "$file" > "$temp_file"
    mv "$temp_file" "$file"
done

但是当使用 openapi 生成器 python-aiohttp 时,它只能部分解决问题,因为返回类型可以是基于 async_req 参数的同步或异步,并且对结果调用 wait 会删除类型信息。

synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True

>>> thread = api.read_host(host_id, async_req=True]
>>> result = thread.get()

现在至少输入了一些参数。

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