如何优雅地创建自定义断言错误?

时间:2018-07-24 07:41:38

标签: python python-3.x function

我做了很多控制基于消息的工具的功能。我知道如何使用它们,但是功能应该是万无一失的,以防万一我走了以后有人想用它编写代码。这是一个示例函数:

def AutoRange(self, Function, Source, Value):
    """Enable or disable the instrument autoranging feature.\n
    :Function: "source" or "measure".
    :Source: "v" or "i".
    :Value: 0 or 1."""

    # <Something goes here to check if the inputs are valid>
    self.WRITE("smua.%s.autorange%s = %s" %(Function, Source, Value))

为了符合输入要求,我最初以一种丑陋的方式在开头添加了RaiseException

    AllowedFunctions = ("source", "measure")
    AllowedSources = ("v", "i")
    AllowedValues = (0, 1)
    if not(Function in AllowedFunctions and Source in AllowedSources and Value in AllowedValues):
        raise Exception("/!\ Error in Keithley.Autorange(): Input not allowed.")

在阅读了assert()之后,我将if替换为:

    MyErrorMessage = "/!\ Error in Keithley.Autorange(): Input not allowed."
    assert (Function in ("source", "measure")), MyErrorMessage
    assert (Source in ("v", "i")), MyErrorMessage
    assert (Value in (0, 1)), MyErrorMessage

可能更整洁的变体是这样:

    ValidInputs = (    Function in ("source", "measure")
                   and Source in ("v", "i")
                   and Value in (0, 1))

    assert (ValidInputs), "/!\ Error in Keithley.Autorange(): Input not allowed."

第二个选项现在更好,因为我想到了它,因为这样我就可以明确指出哪个输入无效。所以我的问题是:您应该如何处理断言? 1 assert() 输入1个?如果没有,建议的结构是什么?预先感谢。

1 个答案:

答案 0 :(得分:3)

为什么不使用Python?

让我们看一个例子:

open("foo", "q")
# => ValueError: invalid mode: 'q'

open在C中,但是您可以看到gzip.open的样子:

if "t" in mode:
    if "b" in mode:
        raise ValueError("Invalid mode: %r" % (mode,))

不要害怕使代码更长一些;您无法在Python中真正避免使用它。并且,“ Keithley.Autorange()中的错误:不允许输入。”不会告诉程序员不允许哪个输入。在这种情况下,明确和清楚比聪明和简短好。

我愿意:

def auto_range(self, function, source, value):
    if function not in ["source", "measure"]:
        raise ValueError("Invalid function: %s" % function)
    if source not in ["v", "i"]:
        raise ValueError("Invalid source: %s" % source)
    if value not in [0, 1]:
        raise ValueError("Invalid value: %d" % value)
    # ...

与您的问题没有直接关系,但是最好坚持使用该语言的编码样式:在Python中,变量在snake_case中(带下划线的小写字母)。