【问题标题】:How can I export function signatures with mypy?如何使用 mypy 导出函数签名?
【发布时间】:2019-04-13 18:04:17
【问题描述】:

我想看看 mypy 推断出哪些函数签名。有没有办法为我的包导出所有这些?

【问题讨论】:

    标签: python mypy


    【解决方案1】:

    .pyi 文件是 Python 接口文件(请参阅this answer)。它们看起来像这样:

    from typing import Any, Optional
    
    def parallel_for(loop_function: Any, parameters: Any, nb_threads: int = ...): ...
    def clip(number: Any, lowest: Optional[Any] = ..., highest: Optional[Any] = ...): ...
    def consistent_shuffle(*lists: Any): ...
    
    class Location:
        latitude: Any = ...
        longitude: Any = ...
        def __init__(self, latitude: Any, longitude: Any) -> None: ...
        @property
        def latitude(self): ...
        @latitude.setter
        def latitude(self, latitude: Any) -> None: ...
        @property
        def longitude(self): ...
        @longitude.setter
        def longitude(self, longitude: Any) -> None: ...
        def get_google_maps_link(self): ...
        def distance(self, there: Any): ...
    

    这正是我正在寻找的。这些文件可以使用stubgen 生成,它是mypy 的一部分。

    【讨论】:

      【解决方案2】:

      Mypy 不会尝试推断函数签名。相反,mypy(以及所有符合 PEP-484 的类型检查器)将函数签名本身视为“事实来源”,并根据可用的签名进行所有类型检查。

      具体来说,一旦一个函数被(手动)分配了类型提示,mypy 将使用该信息来 a) 在函数内执行类型检查 b) 确保任何其他类型化函数以类型安全的方式调用该函数.

      如果您在方法中省略类型签名,mypy 将完全跳过对该函数的检查。您可以通过使用 --strict--check-untyped-defs 标志调用 mypy 来覆盖此行为。一旦你这样做了,mypy 将假定函数的参数和返回都是type Any, the dynamic type


      如果您正在处理足够大的代码库,则手动向所有现有函数添加类型提示可能会很麻烦。在这种情况下,您可以尝试:

      1. 执行整个程序类型推断以尝试推断函数的类型提示,请尝试改用 pytype。也就是说,请记住 pytype 仍然是一个正在进行中的工作。与 PEP 484 类型检查器执行的更多本地类型推断相比,整个程序类型推断是一个更具挑战性的问题。

      2. 使用Monkeytypepyannotate - 这些程序在运行时挂钩到您的代码,并将尝试根据代码的运行时行为推断类型。

      这两种方法都应该生成可以迭代的草稿质量类型提示。

      mypy 文档有更多关于将 mypy 应用于更大代码库的策略的信息:https://mypy.readthedocs.io/en/latest/existing_code.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 2010-09-28
        • 2023-03-22
        • 1970-01-01
        • 2012-11-13
        • 2012-11-17
        • 1970-01-01
        相关资源
        最近更新 更多