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

新手上路,请多包涵

虽然我知道 Python 的鸭子类型概念,但有时我会为函数参数的类型或函数返回值的类型而苦恼。

现在,如果我自己编写函数,我确实知道类型。但是如果有人想使用和调用我的函数怎么办,他/她怎么知道这些类型呢?我通常将类型信息放在函数的文档字符串中(例如: "...the id argument should be an integer...""... the function will return a (string, [integer]) tuple."

但是在文档字符串中查找信息(并将其作为编码人员放在那里)真的是应该的方式吗?

编辑: 虽然大多数答案似乎都指向“是的,文档!”我觉得这对于“复杂”类型来说并不总是那么容易。

例如:如何在文档字符串中 简洁地 描述一个函数返回一个元组列表,每个元组的形式为 (node_id, node_name, uptime_minutes) 并且元素分别是字符串、字符串和整数?

docstring PEP 文档没有给出任何相关指导。

我想反对意见是在那种情况下应该使用类,但我发现 python 非常灵活,因为它允许使用列表和元组传递这些东西,即 没有 类。

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

阅读 657
2 个回答

这就是动态语言的工作原理。但这并不总是一件好事,尤其是在文档很差的情况下——有人试图使用一个文档很差的 python 框架吗?有时您必须重新阅读源代码。

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

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

另外,最重要的一点之一:

  • 尽可能将数据保存在本地!

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

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

原文由 Daren Thomas 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

现在可以这样写:

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

正如您现在看到的类型,有某种可选的静态类型检查将帮助您和您的类型检查器检查您的代码。

有关更多解释,我建议查看 PyCharm 博客 中有关类型提示的博文。

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

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