我想知道在Python中指示无效参数组合的最佳实践。我遇到过一些情况,你有一个这样的函数:

def import_to_orm(name, save=False, recurse=False):
    """
    :param name: Name of some external entity to import.
    :param save: Save the ORM object before returning.
    :param recurse: Attempt to import associated objects as well. Because you
        need the original object to have a key to relate to, save must be
        `True` for recurse to be `True`.
    :raise BadValueError: If `recurse and not save`.
    :return: The ORM object.
    """
    pass

唯一的麻烦是每个包都有自己的BadValueError,通常略有不同。我知道在Java中存在Java .lang. illegalargumentexception——每个人都将在Python中创建自己的BadValueErrors,这是很好理解的,还是有其他的首选方法?


当前回答

我不确定我是否同意从ValueError继承——我对文档的解释是ValueError只应该由内置程序引发……继承它或自己抚养它似乎不正确。

当内置操作或 函数接收具有的实参 正确的类型,但不合适 价值,而情境则不然 由一个更精确的异常描述 例如IndexError。

——ValueError文档

其他回答

我只会引发ValueError,除非你需要一个更具体的异常..

def import_to_orm(name, save=False, recurse=False):
    if recurse and not save:
        raise ValueError("save must be True if recurse is True")

真的没有必要做类BadValueError(ValueError):pass -你的自定义类在使用ValueError时是相同的,所以为什么不使用它呢?

我不确定我是否同意从ValueError继承——我对文档的解释是ValueError只应该由内置程序引发……继承它或自己抚养它似乎不正确。

当内置操作或 函数接收具有的实参 正确的类型,但不合适 价值,而情境则不然 由一个更精确的异常描述 例如IndexError。

——ValueError文档

同意Markus的建议,滚动您自己的异常,但是异常的文本应该澄清问题在参数列表中,而不是单个参数值。我提议:

class BadCallError(ValueError):
    pass

当缺少特定调用所需的关键字参数,或参数值单独有效但彼此不一致时使用。当特定参数是正确类型但超出范围时,ValueError仍然是正确的。

这不应该是Python中的一个标准异常吗?

一般来说,我希望Python风格能够更清晰地区分函数的错误输入(调用者的错误)和函数内的错误结果(我的错误)。因此可能还会有BadArgumentError来区分参数中的值错误和局部变量中的值错误。

我将从ValueError继承

class IllegalArgumentError(ValueError):
    pass

有时创建自己的异常会更好,但要从内置异常继承,这样就尽可能接近您想要的异常。

如果您需要捕获特定的错误,那么有一个名称是很有帮助的。

我认为最好的处理方法是python本身处理它的方式。Python引发TypeError。例如:

$ python -c 'print(sum())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0

我们的初级开发人员刚刚在谷歌上搜索“python异常错误参数”时发现了这个页面,我很惊讶,自这个问题被提出以来的十年里,这个明显的(对我来说)答案从未被提出过。