4

如何正确地拒绝在 Python 构造函数中创建对象?考虑一个对象:

class Triangle:
    def __init__(self, a, b, c):
        sides = [a, b, c]
        sides.sort()
        if sides[0]+sides[1] < sides[2]:
            return None
        self._a = a
        self._b = b
        self._c = c

如果三角形的边不符合逻辑,我想拒绝创建三角形对象。返回None不会阻止创建 Triangle 对象,返回False会引发异常。处理这个问题的正确方法是什么?当给出错误的参数时,我应该抛出某种类型的异常吗?

4

2 回答 2

8

要么引发异常

class Triangle:
    def __init__(self, a, b, c):
        sides = [a, b, c]
        sides.sort()
        if sides[0]+sides[1] < sides[2]:
            raise ValueError('invalid triangle!')
        self._a = a
        self._b = b
        self._c = c

或使用断言(它本身引发异常)

class Triangle:
    def __init__(self, a, b, c):
        sides = [a, b, c]
        sides.sort()
        assert sides[0]+sides[1] >= sides[2]
        self._a = a
        self._b = b
        self._c = c

哪个更合适取决于抛出无效值是否应该是您的 API 的一部分(第一个版本),或者只是为了帮助查找程序员错误(第二个版本,如果您将-O“优化”标志传递给python解释器)。

于 2013-06-26T07:37:25.243 回答
2

None不允许从构造函数返回值(偶数)

正如您所建议的,应该引发异常。

class Triangle:
    def __init__(self, a, b, c):
        sides = [a, b, c]
        sides.sort()
        if sides[0]+sides[1] < sides[2]:
            raise ValueError()
        self._a = a
        self._b = b
        self._c = c
于 2013-06-26T07:27:48.723 回答