Python异常处理 - 如何做到pythonic?

use*_*268 6 python exception

我还在学习Python programmimg语言.我在代码异常方面问自己,当需要以pythonic方式处理这种情况时.我读了几遍"你永远不应该默默地传递错误".

例如一个小功能:

def square(list_with_items):
    return [i**2 for i in list_with_items]
Run Code Online (Sandbox Code Playgroud)

如果有人将元组作为参数传递,是否需要编写错误处理程序?或者,当我必须检查用户输入的验证时,它更有意义吗?

Dav*_*ver 9

在检查类型的特定情况下,"Pythonic"要做的就是不检查它们.除非有充分的理由,否则你应该假设呼叫者传递的是合理类型(注意:"明智的类型"可能与"你期望的类型"不同),并尽力返回合理的东西.如果呼叫者传递的是一种不合理的类型,那么让他们处理后果是完全可以接受的.

例如,有人可能明智地将Decimal数字迭代器传递给square函数:

>>> from decimal import Decimal
>>> square(Decimal(line.strip()) for line in open("numbers.txt")
[Decimal("4.0"), Decimal("9.0"), ...]
Run Code Online (Sandbox Code Playgroud)

一切都会奏效!但明确检查类型会使该用例更加困难.

然后,例如,如果有人传递了一些不合理的东西,他们就可以处理错误:

>>> square(42)
…
TypeError: 'int' object isn't iterable
Run Code Online (Sandbox Code Playgroud)

此错误消息还将(在脚本中)包含调试问题所需的所有文件名和行号.

另一方面,当调用者可能会出现令人惊讶的后果时,显式检查参数有时很有用.例如,如果您正在编写一个函数,该函数的性能非常差,list因为它需要a deque,那么检查if not isinstance(input, deque): raise TypeError("a deque must be used!")可能是合理的.

这种"处理类型的方法"的名称叫做Duck Typing.