使用单个推导式检查一个集合中的任意项是否在另一个集合中可能吗?

-1 投票
1 回答
45 浏览
提问于 2025-04-13 13:00

我在单元测试中有以下检查:

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'

不过,上面的单元测试失败了,但我本来希望它能通过。

all_downstream_task_for_dl_task 是一个包含两个项目的集合:

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

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

我的列表推导式是不是没有按我预期的那样工作?

我本来认为单元测试应该通过,因为 all_downstream_task_for_dl_task 中的第二个项目包含了 first_cpp_pass

1 个回答

3

我一般会避免使用列表推导式(comprehensions),当它的行数超过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'

所以主要的做法就是把内层循环的括号去掉。因为有了括号,你的代码会检查pass1_task是否在括号内定义的生成器里,而这个检查的结果是False

撰写回答