Python 3 函数签名的类型提示

问题描述 投票:0回答:3

有没有办法用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
则可以。

python python-typing
3个回答
35
投票

为此,请使用

typing.Callable
类型(请参阅此处):

from typing import Callable

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

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

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


2
投票

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

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

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

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

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


但是,如果您的目的只是提供可调用的类型提示,而不进行强制、错误引发或自动检查,那么请检查 @dseuss 的答案:)


0
投票

您可以使用函数注释来判断用户定义函数的签名。但实际上这只是一个元信息。它不强制执行任何类型检查规则。

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

通常,Python 将仍然是一种动态类型语言,即使按照惯例,作者也不希望强制类型提示。请参阅 - 输入提示

© www.soinside.com 2019 - 2024. All rights reserved.