代码之家  ›  专栏  ›  技术社区  ›  user21641220

是否可以通过单一理解来检查一组中的任何项目是否在另一组中?

  •  -1
  • user21641220  · 技术社区  · 1 年前

    我在单元测试中进行了以下检查:

    any(pass1_task in (task for task in all_downstream_task_for_dl_task) for pass1_task in
                                {'first_pass', 'first_cpp_pass'}),'the test failed unexpectedly')
    

    上面的内容没有通过单元测试,而我希望它能通过。

    all_downstream_task_for_dl_task 是一个包含2个项目的列表:

     {'cbbo_snowflake_copy_XAMS', 'first_cpp_pass.euronext3-equities_nl_A_3'}
    

    事实上,这个列表要长得多,但为了简单起见,我们假设它包含了以上两个。

    我的列表理解没有达到我的预期吗?

    我希望单元测试能够通过,因为中的第二项 all_downstream_task_for_dl_task 包含 first_cpp_pass

    1 回复  |  直到 1 年前
        1
  •  2
  •   balintd    1 年前

    当它的行溢出79个字符时,我通常会避免理解,这不仅是因为 PEP 8 ,但也因为它们失去了简化代码的主要目标。如果我做对了,这就是你想要实现的目标:

    is_in_task = []
    for pass1_task in {'first_pass', 'first_cpp_pass'}:
        for task in all_downstream_task_for_dl_task:
            is_in_task.append(pass1_task in task)
    
    assert any(is_in_task), 'the test failed unexpectedly'
    

    并且理解:

    assert any(pass1_task in task for task in all_downstream_task_for_dl_task for pass1_task in {'first_pass', 'first_cpp_pass'}), 'the test failed unexpectedly'
    

    因此,主要的是,您只需要从内部for循环中删除括号,因为使用括号,您的代码将检查 pass1_task 在圆括号之间定义的生成器中,其计算结果为 False .