python - 您如何检查打字 stub (.pyi) 文件是否与实现匹配?

标签 python typeshed python-typing

你可以使用mypy的stubgen.py或其他工具 generate .pyi files automatically ,但 stubgen 包含检查 stub 文件准确性的附加建议。

如果我自动生成 stub ,然后修改它们以修复错误或使生成器没有发现的事情更加严格,那么我如何检查它们是否同意实现?或者随着实现的变化和我手动生成的文件,我如何确保它们保持同步?

最佳答案

由于需要这样做,我也发现了这个问题,所以这是我随后发现的......
Apparently, a tool called stubtest was recently added to mypy (目前未记录)这将在可能的情况下根据实现验证 stub 。这是一个人为的例子:

$ cat <<EOF > simple.py
> def thing(obj):
>     if isinstance(obj, float):
>         return 0.0
>     elif isinstance(obj, int):
>         return 0
>     else:
>         raise TypeError("Unsupported type passed to thing.")
> 
> EOF
我创建了一个 stub 文件,它使用实现的知识来编写特定的类型注释(绝对不是自动生成的 - 这很难做到!):
$ cat <<EOF > simple.pyi
> from typing import Any, Union
> 
> def thing(obj: Union[float, int]): ...
> 
> EOF
运行 stubtest 没有输出,并且退出代码为零:
$ python -m mypy.stubtest simple

$ echo $?
0
现在我更新实现以获得另一个参数:
cat <<EOF > simple.py
> def thing(obj, something_else):
>     if isinstance(obj, float):
>         return 0.0
>     elif isinstance(obj, int):
>         return 0
>     else:
>         raise TypeError("Unsupported type passed to thing.")
> 
> EOF
并重新运行 stub 测试:
$ python -m mypy.stubtest simple
error: simple.thing is inconsistent, stub does not have argument "something_else"
Stub: at line 3
def (obj: Union[builtins.float, builtins.int]) -> Any
Runtime: at line 1 in file stub-testing/simple.py
def (obj, something_else)

$ echo $?
1
我对mypy搜索路径的理解还很薄弱,无法直接获取stubtest工作的入口点(与 python -m mypy.stubtest 形式相反)。
我还没有针对比这个玩具示例更复杂的任何东西进行测试 - 我怀疑细节中有很多魔鬼。

关于python - 您如何检查打字 stub (.pyi) 文件是否与实现匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716200/

相关文章:

Python void 返回类型注解

python - concurrent.futures.ThreadPoolExecutor.map 比 for 循环慢

python - 在解释器中重新加载(更新)模块文件

python父子关系类

python - Pandas 数据帧阈值——如果超过则保持数字固定

python - 如何为已编译的 Python 扩展生成 .pyi 文件?

python - 父类的引用 sibling

python - 如何键入提示具有封闭类类型的方法?