gpt4 book ai didi

python - 为什么这个函数的类型注释不正确(错误 : Missing type parameters for generic type)?

转载 作者:行者123 更新时间:2023-12-02 02:13:27 24 4
gpt4 key购买 nike

此函数的类型注释正确吗?

import subprocess
from os import PathLike
from typing import Union, Sequence, Any


def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, PathLike]]], **subprocess_run_kwargs: Any) -> int:
return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode

我猜不是,因为我得到:

he\other.py:6: 错误:缺少泛型类型的类型参数

要得到相同的错误,请将上述代码保存在 other.py 中,然后:

$ pip install mypy

$ mypy --strict other.py

最佳答案

正如 sanyash 的答案中所述,os.PathLike 被定义为泛型类型。你可以看看stub in the typeshed repo 。但是,os.PathLike 仅在 stub 文件中是通用的,可从 os 导入的实现则不是

未指定类型 var 参数 (path: PathLike) 会导致 mypy 错误。指定 var 类型参数 (path: PathLike[Any]) 会导致 Python 解释器(运行时)错误。

这个确切的问题已在 mypy 存储库中提出为 #5667 。结果PR #5833扩展 mypy 文档:

添加的部分指出了处理此问题的三种方法:

  1. 可以使用特殊的 from __future__ import 注解 导入来禁用 Python 解释器(在运行时)对注解的解释,see here 。这计划成为 Python 3.10 中的默认设置,并解决一系列与注释相关的问题。

    from __future__ import annotations
    from os import PathLike
    import subprocess
    from typing import Any, Sequence, Union

    def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, PathLike[Any]]]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode
  2. 使用 typing.TYPE_CHECKING 根据类型检查器或 Python 解释器(运行时)是否解释文件来提供不同的注释。

    from os import PathLike
    import subprocess
    from typing import Any, Sequence, TYPE_CHECKING, Union

    if TYPE_CHECKING:
    BasePathLike = PathLike[Any]
    else:
    BasePathLike = PathLike

    def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, BasePathLike]]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode
  3. 以字符串形式提供注释。 Python 解释器(运行时)不会解释注释,但 mypy 会获取正确的含义。

    import subprocess
    from typing import Any, Sequence, Union

    def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, 'PathLike[Any]']]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode

关于python - 为什么这个函数的类型注释不正确(错误 : Missing type parameters for generic type)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55076778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com