Каков питонный способ выполнения нескольких условий, одно за другим, при этом показывая пользователю, кто первым потерпел неудачу - PullRequest
0 голосов
/ 15 января 2019

Допустим, у меня есть этот рабочий код:

def check_some_conds(args):
    assert (condA(args) or
            condB(args))

    assert condC(args)
    assert condD(args)

    return True

(Да, я знаю, что assert это плохо, но, пожалуйста, потерпите меня на минутку)

Теперь, когда я вызываю эту функцию, я могу (более или менее) получить первое ошибочное утверждение, используя except AssertionError: и выполнив некоторые действия с модулем трассировки.

Однако это не идеально, потому что:

  • assert оптимизирован для Python
  • Я не могу указать сообщение об ошибке
  • Игра с модулем трассировки в лучшем случае кажется хакерской
  • Мне все еще нужно получить логическое возвращаемое значение, поэтому перехват этого значения и последующее изменение возвращаемого значения - это шаблонный код.

Я ищу способ:

  • Выполнить несколько условий, в основном независимо друг от друга
    • Знание того, что некоторые функции могут быть длинными и должны быть использованы в последний раз (здесь condD может занять несколько секунд
    • И некоторые из них могут быть асинхронными функциями или просто встроенными вычислениями (a == b)
  • вернуть логическое значение (необязательно)
  • зарегистрируйте сообщение, которое говорит condD failed или nor condA or condB succeded

Если это не совсем возможно, пожалуйста, не стесняйтесь предлагать частичные ответы на мою проблему

1 Ответ

0 голосов
/ 15 января 2019

Просмотрите ваши условия и в конце выведите ошибки:

fail = False
for condition in [cond1, cond2, cond3 ...]:

    if not condition(args):
        print(condition.__name__, "failed")
        fail = True
    else:
        print(condition.__name__, "succeeded")
if fail: raise ...
...