功能签名的Python 3类型提示

时间:2018-07-04 01:39:59

标签: python python-3.x typing

有没有一种方法可以使用Python(3.5+)类型提示声明函数对象的签名?具体来说,有一种方法可以声明函数可以接受或变量可以引用的函数对象的类型。

我确定它可能会变得非常凌乱(例如,对于C ++ 11 lambda类型而言),但是至少有某种方法可以检查函数类型吗?

例如:

def func1(x: int) -> int:
    return x

def func2(x: int, y: int) -> int:
    return x + y

# 'TwoArgFn' is a 'function type' that accepts two ints and returns an int
def takes_two(f: TwoArgFn) -> int:
    return f(123, 456)

func1作为参数传递给takes_two应该是错误的,而传递func2很好。

3 个答案:

答案 0 :(得分:2)

为此,请使用typing.Callable类型(请参阅here):

from typing import Callable

def takes_two(f: Callable[[int, int], int]) -> int:
    return f(123, 456)

Callable的第一个参数是函数参数类型的列表,而第二个参数是返回类型。

当然,python本身根本不检查类型。为此,您应该使用其他工具,例如 mypy

答案 1 :(得分:1)

简短的回答:没有内置的方法可以强制执行 类型声明和检查。

顾名思义,这些是 hints 类型,它可以帮助程序员了解作为参数传递的内容以及从函数返回的内容(这在读取/查看大型代码文件时特别有用。 )。但是,从Guido,Jukka和Lukasz的这篇文章中here可以看出:

  

还应该强调的是,Python仍将是一种动态类型化的语言,即使是按照惯例,作者也不希望使类型提示成为强制性的。

因此,如果您期望使用静态类型的参数,如果传递的对象不具有所需的类型,则会引发错误,那么您不应该首先使用python。

但是,您可能有一些选择:例如诸如pycharm或Atom之类的IDE具有可为您检查类型的插件。


但是,如果您的意思是只是具有可调用的类型提示,而没有执行,错误引发或自动检查,则请检查@dseuss的答案:)

答案 2 :(得分:0)

您可以使用功能注释来告知用户定义功能的签名。但这实际上只是一个元信息。它不执行任何类型检查规则。

您可以在pycharm等现代编辑器中使用单独的行类型检查器。这些类型检查器充当强大的linter。

通常,Python仍将是一种动态类型化的语言,即使按惯例,作者也不希望使类型提示成为强制性的。请参阅-type hints