gpt4 book ai didi

Python:鸭子类型(duck typing)与异常处理

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:26 25 4
gpt4 key购买 nike

一个关于 idomatic Python 的问题。假设我有一个函数:

def a_function(list_of_things):
for item in list_of_things:
process_item(item)

现在假设我很难确定输入参数是一个列表。即使是现在,我也能听到甜美的 pythonista 合唱团在恳求我:“使用鸭子类型(duck typing)和异常!”

def a_function(list_of_things):
try:
for item in list_of_things:
process_item(item)
except:
pass # . . . or something

这很好,除非我传入一个映射、一个字符串或任何其他我认为对这个特定应用程序来说“错误”的可迭代方式。

我并没有写大量的 Python,但我设法经常遇到这种情况和相关情况,以至于经常让我烦恼。更一般地说,我想使用鸭子类型(duck typing)和异常,这似乎是 Python 中的惯例,但在很多情况下,可能会得到一个不正确的输入类型来传递我的异常;如此多的异常似乎经常(或至少经常)是错误的答案。

即使异常确实看起来是正确的答案,但我在使用它们时仍然很害怕,因为如果我只是没有想到错误类型会通过的极端情况,留下我的代码,因为没有更好的术语,“躲避”。

所以我最终求助于 type 之类的东西和 isinstance .根据我的阅读,显式类型检查似乎在 Python 中被认为是邪恶的,但还能做什么呢?请注意,我几乎从不在我的 Python 中编写类层次结构,因此我在子类和类型检查方面没有问题,但其他人可能会。

我想到了四种可能的答案,所有这些在我看来都是同样可能的:

  1. 你应该使用异常,但你做错了。像这样做 。 . .
  2. 你应该使用异常(exception)。如果错误的类型通过了检查,则表明您的设计存在问题(什么问题?)
  3. 你做对了。在这些情况下,显式类型检查更可取。
  4. 你不知道 <python thing for this situation> ?做一些研究!

是其中之一,还是其他?

注意 - 我在 SO 上发现了很多关于这个问题的问题,但我正在寻找人们尽可能谈论这个特定“类型”的问题。

最佳答案

最佳实践是类型不可知论。 for 循环为任何不可迭代的类型引发异常。文档应该清楚地说明,需要一个可迭代的类型。使用您的函数的函数应该进行单元或集成测试,以便发现意外行为。

关于Python:鸭子类型(duck typing)与异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com