如果没有上面的python

时间:2017-08-21 14:51:20

标签: python

我需要对传感器数据进行一系列检查,检查都是独立的,因此不能将它们格式化为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语句最让我烦恼,感觉多余(并且可能更慢?)再次检查我已经检查过的所有事情。有没有好办法让这更优雅?

4 个答案:

答案 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")