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

时间:2011-03-17 07:54:12

标签: python types

虽然我知道Python的鸭子输入概念,但我有时会遇到函数的参数类型或函数返回值的类型。

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

但是查找文档字符串中的信息(并将其作为编码器放在那里)真的应该是这样做的吗?

编辑:虽然大多数答案似乎都指向“是的,文档!”我觉得对于“复杂”类型来说这并不总是很容易。
例如:如何在文档字符串中简明扼要地描述,函数返回元组列表,每个元组都有一个元组(node_id,node_name,uptime_minutes)并且元素分别是字符串,字符串和整数?
文档字符串PEP文档没有给出任何指导。
我想反驳就是在这种情况下应该使用类,但我发现python非常灵活,因为它允许使用列表和元组来传递这些东西,即没有类。

10 个答案:

答案 0 :(得分:57)

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

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

现在可以写成:

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

正如您现在可以看到的类型一样,还有一些可选的静态类型检查,它可以帮助您和您的类型检查器调查您的代码。

有关更多说明,我建议您查看PyCharm blog中类型提示的博客文章。

答案 1 :(得分:16)

这就是动态语言的工作方式。然而,它并不总是一件好事,特别是如果文档很差 - 任何人都试图使用文档记录不佳的python框架?有时您必须恢复阅读来源。

以下是一些避免鸭子打字问题的策略:

  • 为您的问题域创建语言
  • 这将帮助您正确命名内容
  • 使用类型来表示域语言中的概念
  • 使用域语言词汇表命名函数参数

另外,最重要的一点是:

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

应该传递一些明确定义和记录的类型。通过查看代码,其他任何事情都应该是显而易见的:不要通过在代码附近查看来自远处的奇怪参数类型...

相关,(也与文档字符串有关),python中有一种名为doctests的技术。用它来记录你的方法应该如何使用 - 并且同时具有良好的单元测试覆盖率!

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:4)

我参加了一门课程,有一节课,我们学习了设计方法。

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

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

答案 4 :(得分:3)

实际上没有必要,因为python是一种动态语言,但是如果你想指定一个返回值,那么就这样做

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

在上面的例子中,如果你给它一个字符串周长,例如 "hello",它会返回 int 然后它会抛出这个异常 TypeError: unsupported operand type(s) for +: 'int' and 'str' 因为它要求一个 int 值,我们给了它一个字符串值,最后因为我们不能添加 int 和 string

然后对于参数类型执行此操作

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

在冒号 (:) 后可以指定参数类型

答案 5 :(得分:2)

是的。

在Python中,函数并不总是必须返回相同类型的变量(尽管如果函数总是返回相同的类型,则代码将更易读)。这意味着您无法为函数指定单个返回类型。

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

答案 6 :(得分:1)

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

阅读本文以供参考:PEP 257

答案 7 :(得分:1)

  

例如:如何在docstring中简明扼要地描述函数返回元组列表,每个元组的元组(node_id,node_name,uptime_minutes)以及元素分别是字符串,字符串和整数?

嗯......对此没有“简明”的描述。这很复杂。你把它设计得很复杂。它需要文档字符串中的复杂文档。

很抱歉,但复杂性很复杂。

答案 8 :(得分:0)

Docstrings(和一般文档)。 Python 3引入(可选)函数注释,如PEP 3107中所述(但不要遗漏文档字符串)

答案 9 :(得分:-2)

我在Python上做过很多工作,所以这不仅是一个简单的答案。请使用Go或TypeScript之类的静态类型语言供生产使用。试图用动态类型化的语言找出任何稍微复杂的应用程序中的类型,这是一种编码恐怖。