Python raise Error正确使用

标签 python exception typechecking raise

描述:

我读过很多关于在 python 中检查值类型的意见,大多数人说你不应该检查类型,而应该使用 try 和 except。 我想澄清一些事情。

问题:

当我有这样的方法时:

def set_age(self, age):
    self._age = age

我不能让用户传递除 int 之外的任何类型,因为稍后在代码中它可能会导致一些更难调试的错误。 根据 Python 方法,我无法检查类型。 那么我应该如何以正确的方式尝试呢?

def set_age(self, age):
    try:
        age = int(age)
    except TypeError:
        raise TypeError('First parameter must be of int type.')
    self._age = age

或者只是

def set_age(self, age):
    self._age = int(age)

并让 Python 自己引发错误。

我知道这可能是愚蠢的问题,我只是想确定一下。

最佳答案

如果它不是整数,Python 将引发适当的错误,因此无需在其之上添加您自己的错误。

让我们退一步,因为这里还有其他问题。 getter 和 setter 确实不符合 Python 风格——要么只使用属性,要么使用 properties .

既然如此,我认为你的想法还是错误的。我们不在 Python 中进行类型检查的原因是我们不应该关心某些东西是什么类型,只要它在给定情况下是否有效即可。一旦你得到它,就将所有东西变成你认为应该是的类型,这本质上是类型检查。

你说这会让调试变得更加困难,但这并不是大多数人真正的经历。鸭子类型的设计目的是让任何可以完成这项工作的东西都能完成这项工作。将所有内容转换为 int 会限制您的程序。问题不在这里,问题在于您的代码传递了对您的类没有意义的内容。根据我的经验,这实际上是一件非常罕见的事情 - 你不会倾向于在类里面随意扔东西并看看什么会粘住。

所以,我的建议是您使用一个属性 - 只需执行 x.age = ... 而不是使用 set_age() 或类似的东西。如果您确实需要一个int(例如,只有整数才有意义),那么使用一个属性并调用int() setter,如果发生错误,则将错误传播给调用者。

关于Python raise Error正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14537936/

相关文章:

如果在类中声明,Python 无法连接到 MySQL

python - 在 pandas 数据框中将列中的值从十六进制转换为二进制

c - 未处理的异常,将信息写入文件C语言

java - 使用 RuntimeExceptions 进行错误处理是一个好习惯吗?

python - 与 ORB python opencv 匹配特征

python - 从 ubuntu 基础镜像和 python 基础镜像构建 docker 的区别?

作为参数传递给 onclick() 的 C# 变量未定义

haskell - 编写 binop 来处理 int 和 float

Java:Instanceof 和泛型

Python 3.6 类型检查 : numpy arrays and use defined classes