函数签名的 Python 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 是好的。

原文由 patmanpato 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

为此,请使用 typing.Callable 类型(参见 此处):

 from typing import Callable

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

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

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

原文由 dseuss 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

顾名思义,这些是类型 _提示_,可以帮助程序员了解什么作为参数传递以及函数返回什么(这在阅读/查看大型代码文件时特别有用)。然而,从 Guido、Jukka 和 Lukasz 这篇帖子中可以看出:

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

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

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


但是,如果您的意思是只有一个可调用的类型提示而不强制执行、错误引发或自动检查,那么请检查@dseuss 的回答 :)

原文由 rafaelc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题