Nic*_*k T 5 python typeshed python-typing
您可以使用 mypystubgen.py或其他一些工具自动生成.pyi文件,但 stubgen 包含检查存根文件准确性的附加建议。
如果我自动生成存根,然后修改它们以修复错误或使生成器没有发现的事情更加严格,那么我如何检查它们是否同意实现?或者随着实现的变化和我手动生成的文件,我如何确保它们保持同步?
我发现这个问题是因为也需要这样做,所以这是我随后发现的......
显然,最近在 mypy 中添加了一个名为 Stubtest 的工具(当前未记录),它将尽可能根据实现验证存根。这是一个人为的例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
我创建了一个存根文件,它使用实现知识来编写特定类型注释(绝对不是自动生成的 - 这很难做到!):
$ cat <<EOF > simple.pyi
> from typing import Any, Union
>
> def thing(obj: Union[float, int]): ...
>
> EOF
Run Code Online (Sandbox Code Playgroud)
运行 Stubtest 不会产生任何输出,并且退出代码为零:
$ python -m mypy.stubtest simple
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
现在我更新实现以获得另一个参数:
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
Run Code Online (Sandbox Code Playgroud)
并重新运行存根测试:
$ 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
Run Code Online (Sandbox Code Playgroud)
我对 mypy 搜索路径的理解仍然相当薄弱,并且无法让直接stubtest入口点工作(与表单相反python -m mypy.stubtest)。
我还没有对比这个玩具示例更复杂的东西进行测试 - 我怀疑细节中有很多魔鬼。
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |