如何知道函数返回类型和参数类型?

虽然我知道 Python 的 Duck-type 概念,但我有时会纠结于函数的参数类型或函数的返回值类型。

现在,如果我自己编写函数,我确实知道类型。但是,如果有人想要使用并调用我的函数,他/她如何期望知道类型? 我通常将类型信息放在函数的 docstring 中(如: "...the id argument should be an integer...""... the function will return a (string, [integer]) tuple.")

但是,在 docstring 中查找信息(并将其放在那里,作为一个编码器)真的是应该采用的方式吗?

编辑: 虽然大多数的回答似乎直接指向“是的,文档!”我觉得对于“复杂”类型的人来说,这并不总是那么容易。例如: 如何在 docstring 中描述 简明扼要,函数返回一个元组列表,每个元组的形式(node _ id,node _ name,uptime _ minutes)和元素分别是一个字符串、字符串和整数?
Docstring PEP 文档没有提供任何关于这方面的指导原则。
我猜反对意见是在这种情况下应该使用类,但是我发现 python 非常灵活,因为它允许使用列表和元组(即 没有类)传递这些内容。

231976 次浏览

是的,您应该使用 docstring 使您的类和函数对其他程序员更友好:

更多: http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring

有些编辑器允许您在输入时查看文档字符串,因此它确实使工作更加容易。

是的,因为它是一种动态类型语言;)

请阅读以下参考资料: PEP 257

是的。

在 Python 中,函数并不总是必须返回相同类型的变量(尽管如果函数总是返回相同类型的话,代码的可读性会更好)。这意味着不能为函数指定单个返回类型。

同样,参数也不必总是相同的类型。

这就是动态语言的工作原理。但是这并不总是一件好事,特别是当文档很差的时候——有人试图使用文档很差的 Python 框架吗?有时候你不得不重新阅读原文。

以下是一些避免 Duck 类型问题的策略:

  • 为您的问题域创建一种语言
  • 这会帮助你正确地命名东西
  • 使用类型来表示领域语言中的概念
  • 使用域语言词汇表的名称函数参数

此外,最重要的一点是:

  • 保持数据尽可能本地化!

应该只有少数定义良好且有文档记录的类型被传递。通过查看代码,其他任何东西都应该是显而易见的: 不要有来自远处的奇怪的参数类型,这些参数类型你无法通过查看代码的附近来弄清楚..。

与此相关(也与 docstring 相关) ,python 中有一种称为 doctests的技术。使用它来记录如何使用您的方法-同时具有良好的单元测试覆盖率!

Python 3引入了(可选的)函数注释,如 PEP 3107所述(但不要忽略 docstring)

例如: 如何在 docstring 中简明地描述一个函数返回一个元组列表,每个元组的形式(node _ id,node _ name,uptime _ minutes)和元素分别是一个字符串,字符串和整数?

没有什么“简洁”的描述。很复杂。你把它设计得很复杂。它需要文档字符串中的复杂文档。

抱歉,但是复杂性就是复杂。

我参加了一个课程,我们学习了设计食谱。

在 docstring 格式下面,我发现非常有用。

def area(base, height):
'''(number, number ) -> number    #**TypeContract**
Return the area of a tring with dimensions base   #**Description**
and height


>>>area(10,5)          #**Example **
25.0
>>area(2.5,3)
3.75
'''
return (base * height) /2

我认为如果文档字符串是以这种方式编写的,可能会对开发人员有很大帮助。

链接到视频 [一定要看视频]: https://www.youtube.com/watch?v=QAPg6Vb_LgI

自从2011年以来,情况有了一些变化!现在 Python 3.5中有了 类型提示,您可以使用它来注释参数并返回函数的类型。例如:

def greeting(name):
return 'Hello, {}'.format(name)

现在可以这样写:

def greeting(name: str) -> str:
return 'Hello, {}'.format(name)

正如您现在可以看到的类型,有一些可选的静态类型检查,这将帮助您和您的类型检查器研究您的代码。

为了获得更多的解释,我建议看一下关于 PyCharm 博客中类型提示的博客文章。

实际上没有必要,因为 python 是一种动态语言,如果您想指定返回值,那么可以使用 但是

def foo(a) -> int: #after arrow type the return type
return 1 + a

但这对你没什么帮助。它不会像 Java、 c、 c + + 这样的静态类型语言那样引发异常。即使返回一个字符串,也不会引发任何异常。

然后对参数类型执行这个操作

def foo(a: int) -> int:
return a+ 1

在冒号(:)之后,可以指定参数类型。 这也无济于事,举个例子来证明这一点:

def printer(a: int) -> int: print(a)


printer("hello")

上面的函数实际上只返回 None,因为我们没有返回任何东西,但是我们确实告诉它我们将返回 int,但是正如我所说的,它没有帮助。也许它可以在 IDE 中提供帮助(不是所有但很少像 pycharm或其他东西,但不是在 vscode上)