我需要对传感器数据进行一系列检查,检查都是独立的,因此不能将它们格式化为elif或elses,如果有任何检查失败,我需要将其打印给用户。如果没有检查失败,我想告诉用户传感器没问题
(我只是遍历数组中所有传感器的迭代器)
if worst_stdev[i] > 5:
print("Sensor bad, STDEV VALUE: {}".format(worst_stdev[i]))
if worst_invalid[i] > 2:
print("Sensor bad, INVALID VALUE: {}".format(worst_invalid[i]))
if worst_err[i] > 1:
print("Sensor bad, ERROR VALUE: {}".format(worst_bit_err[i]))
if not (worst_stdev[i] > 5 or worst_invalid[i] > 2 or worst_err[i] > 1):
print("Sensor OK")
最后的if语句最让我烦恼,感觉多余(并且可能更慢?)再次检查我已经检查过的所有事情。有没有好办法让这更优雅?
答案 0 :(得分:8)
我会保留一个标记变量来跟踪错误。例如:
was_error = False
if worst_stdev[i] > 5:
print("Sensor bad, STDEV VALUE: {}".format(worst_stdev[i]))
was_error = True
if worst_invalid[i] > 2:
print("Sensor bad, INVALID VALUE: {}".format(worst_invalid[i]))
was_error = True
if worst_err[i] > 1:
print("Sensor bad, ERROR VALUE: {}".format(worst_bit_err[i]))
was_error = True
if not was_error:
print("Sensor OK")
或者,您可以使用多个不同的错误变量,以便了解发生了哪个错误。如果你不关心抛出了哪个错误,但是想知道它们中有多少错误,你可以每次都增加错误变量。这样做的结果仍然是使用语法if not was_error:
答案 1 :(得分:6)
执行所有三次比较,在if
之前将值存储在变量中。这是为了确保我们只执行比较。这样我们避免引入新标志。它也更强可读。也可以在最后的if statemeny使用any
。它更具可读性。 (感谢@SethMMorton)
bad_stdev = worst_stdev[i] > 5
bad_invalid = worst_invalid[i] > 2
bad_err = worst_err[i] > 1
if bad_stdev:
print("Sensor bad, STDEV VALUE: {}".format(worst_stdev[i]))
if bad_invalid:
print("Sensor bad, INVALID VALUE: {}".format(worst_invalid[i]))
if bad_err:
print("Sensor bad, ERROR VALUE: {}".format(worst_bit_err[i]))
if not any([bad_stdev, bad_invalid, bad_err]):
print("Sensor OK")
答案 2 :(得分:1)
这确实是一个背景问题。
如果您有许多可能的不同的条件,您可以在特殊功能中传递条件和案例,例如:
def check_cases(i, cases, text='sensor bad'):
for case, (param, condition) in cases.items():
value = param[i]
if condition(value):
yield ValueError(f'{text}: {value}')
然后为它提供一些条件。
cases = {'stdev value': (worst_stdev, lambda x: x > 5), 'invalid value': (worst_invalid, lambda x: x > 2), 'error value': (worst_bit_err, lambda x: x > 1)}
errors = list(check_cases(1, cases))
然后打印本身很明显:
for err in errors:
print(err)
if not errors:
print('OK')
但是,如果您真正需要的只是您发布的这三个比较,那么您最好坚持自己的决定。它非常清晰可读。
答案 3 :(得分:0)
这取决于代码的执行方式。您可以执行类似的操作并捕获异常,以便它不会到达最终的print语句(显然您必须定义Exception):
if worst_stdev[i] > 5:
raise BadSensorException("Sensor bad, STDEV VALUE: {}".format(worst_stdev[i]))
if worst_invalid[i] > 2:
raise BadSensorException("Sensor bad, INVALID VALUE: {}".format(worst_invalid[i]))
if worst_err[i] > 1:
raise BadSensorException("Sensor bad, ERROR VALUE: {}".format(worst_bit_err[i]))
print("Sensor OK")