我想知道在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中创建自己的 BadValueError 或者是否有另一种首选方法?

有帮助吗?

解决方案

我只会提出 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)真的没有意义:传递 - 您的自定义类在使用中与 ValueError ,为什么不使用它?

其他提示

我将继承自 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

我们的初级开发人员刚刚在Google搜索“python exception wrong arguments”中找到了这个页面。我感到惊讶的是,自从提出这个问题以来,十年来没有人提出明显(对我而言)的答案。

我刚刚看到在这种情况下使用的内置 ValueError

我不确定我同意 ValueError 的继承 - 我对文档的解释是 ValueError 只是 应该是由内置者提出...继承或自己提升它似乎是错误的。

  

内置操作时引发或   函数接收有一个参数   正确的类型但不合适   价值,情况不是   由更精确的例外描述   例如IndexError。

- ValueError文档

这取决于参数的问题是什么。

如果参数的类型错误,则引发TypeError。例如,当你得到一个字符串而不是其中一个布尔值时。

if not isinstance(save, bool):
    raise TypeError(f"Argument save must be of type bool, not {type(save)}")

但请注意,在Python中我们很少进行任何类似的检查。如果论证真的无效,一些更深层的功能可能会为我们抱怨。如果我们只检查布尔值,也许某些代码用户稍后会给它一个字符串,知道非空字符串总是为True。这可能会让他失去演员。

如果参数的值无效,则引发ValueError。这似乎更适合你的情况:

if recurse and not save:
    raise ValueError("If recurse is True, save should be True too")

或者在这种特定情况下,具有True值的递归意味着保存的True值。由于我认为这是从错误中恢复,您可能还想在日志中抱怨。

if recurse and not save:
    logging.warning("Bad arguments in import_to_orm() - if recurse is True, so should save be")
    save = True

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

class BadCallError(ValueError):
    pass

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

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

一般情况下,我希望Python样式在将错误输入与函数(调用者的错误)区分开来时更加清晰,而不是函数中的错误结果(我的错)。因此,可能还有BadArgumentError来区分参数中的值错误和本地值中的值错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top