我做了很多控制基于消息的工具的功能。我知道如何使用它们,但是功能应该是万无一失的,以防万一我走了以后有人想用它编写代码。这是一个示例函数:
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个?如果没有,建议的结构是什么?预先感谢。
答案 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
中(带下划线的小写字母)。