关于python:如何使用mypy导出函数签名?

How can I export function signatures with mypy?

我想看看Mypy推断的是什么函数签名。有没有办法把它们全部出口到我的包裹里?


.pyi文件是python接口文件(见本答案)。它们看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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的一部分。


mypy不尝试推断函数签名。相反,mypy(以及所有符合PEP-484的类型检查程序)将函数签名本身视为"真实性来源",并根据可用的签名执行所有类型检查。

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

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

如果您在一个足够大的代码基上工作,那么手工向所有现有函数添加类型提示可能会很麻烦。在这种情况下,您可以尝试:

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

  • 使用monkeytype或pyannotate——这些程序在运行时钩住代码,并根据代码的运行时行为来推断类型。

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

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