如何使用mypy导出函数签名?

时间:2018-11-10 10:36:21

标签: python mypy

我想看看mypy推断出什么函数签名。有没有办法为我的包裹将它们全部导出?

2 个答案:

答案 0 :(得分:0)

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

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

如果您从方法中省略类型签名,则mypy将完全跳过对该功能的检查。您可以通过使用--strict--check-untyped-defs标志调用mypy来覆盖此行为。完成此操作后,mypy将假定函数的参数和return均为type Any, the dynamic type


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

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

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

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

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

答案 1 :(得分:0)

.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): ...

这正是我正在搜索的内容。这些文件可以使用mypy中的stubgen生成。