Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个接一个地执行多个条件的python方法是什么,同时向用户显示哪一个是第一个失败的_Python_Python 3.x_Conditional_Refactoring - Fatal编程技术网

一个接一个地执行多个条件的python方法是什么,同时向用户显示哪一个是第一个失败的

一个接一个地执行多个条件的python方法是什么,同时向用户显示哪一个是第一个失败的,python,python-3.x,conditional,refactoring,Python,Python 3.x,Conditional,Refactoring,假设我有这个工作代码: def check_some_conds(args): assert (condA(args) or condB(args)) assert condC(args) assert condD(args) return True (是的,我知道asserts是不好的,但请容忍我一会儿) 现在,当我调用这个函数时,我可以(或多或少地)通过使用除AssertionError:之外的并通过使用traceback模块执行

假设我有这个工作代码:

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

    assert condC(args)
    assert condD(args)

    return True
(是的,我知道
assert
s是不好的,但请容忍我一会儿)

现在,当我调用这个函数时,我可以(或多或少地)通过使用除AssertionError:之外的
并通过使用traceback模块执行一些魔术来重新获取第一个失败的断言

但是,这并不理想,因为:

  • assert
    在python中得到了优化
  • 我真的无法指定错误消息
  • 玩回溯模块充其量也会让人感觉不舒服
  • 我仍然需要得到一个布尔返回值,因此捕获该值然后更改返回值是样板代码
我正在寻找一种方法:

  • 运行多个条件,其中大部分是独立的
    • 知道某些函数可能很长,必须最后一次尝试(此处,
      cond
      可能需要几秒钟
    • 其中一些可能是异步函数或只是内联求值(
      a==b
  • 返回布尔值(可选)
  • 记录一条消息,说明
    condD失败
    或condA或condB成功

如果这真的不可能,请随意建议我的问题的部分答案

循环您的条件,并在最后提出错误:

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 ...

在您的条件下使用for进行迭代,如果是,则执行try/except以捕获异常?@roganjosh在优化模式下运行python时,
\uuu debug\uuu
为False,断言语句将被忽略。为什么不使用pytest?@frenchmastswigh可以这样做,但这意味着必须编写大部分错误消息通过hand@RamazanPolat这实际上不是为了运行测试(如果只是…),但更多关于一个实时系统,它可以检查一些邮件中的垃圾邮件内容。例如,在我的代码中,condA可能指的是帐户的年龄。使用
条件。\uu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu每个条件都会改变参数?我可能也会传递一组参数,但是你有更好的主意吗?在
if not条件
中添加
break
,以与
assert
停止测试的方式保持一致(如果仍然需要此行为)这取决于参数如何变化。如果每个条件的参数都有很高的自定义级别,那么最好将所有参数传递到每个条件中,并处理在条件本身内部使用的参数。但是一个简单的bool断言,例如
a==b
在赞扬,因为它直接计算为
bool