虽然我知道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非常灵活,因为它允许使用列表和元组来传递这些东西,即没有类。
答案 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之类的静态类型语言供生产使用。试图用动态类型化的语言找出任何稍微复杂的应用程序中的类型,这是一种编码恐怖。