跳转至

Python3.8 yield 表达式不允许在推导式和生成器表达式中使用

yield 表达式(包括 yieldyield from 子句)现在不允许在推导式和生成器表达式中使用(但 for 子句最左边的可迭代对象表达式除外)。 (由 Serhiy Storchaka 在 bpo-10544 中贡献。)

https://bugs.python.org/issue10544

code:

info = [
    {'SHA': 'COMMIT_SHA1'},
    {'SHA': 'COMMIT_SHA2'},
    {'SHA': 'COMMIT_SHA3'},
    {'SHA': 'COMMIT_SHA3'},
]
filter_info = [
    {'COMMIT_SHA': 'COMMIT_SHA2'},
    {'COMMIT_SHA': 'COMMIT_SHA3'},
]

filter_list = [i['COMMIT_SHA'] for i in filter_info]
print(filter_list)


def filter_func(n):
    sha = n['SHA']
    if sha not in filter_list:
        yield True


def filter_func2(n):
    sha = n['SHA']
    if sha not in filter_list:
        return n
# filter 函数中使用yield True 无效果
filter_info = list(filter(filter_func, info))
filter_info2 = list(filter(filter_func2, info))

上面代码执行结果如下

['COMMIT_SHA2', 'COMMIT_SHA3']
[{'SHA': 'COMMIT_SHA1'}, {'SHA': 'COMMIT_SHA2'}, {'SHA': 'COMMIT_SHA3'}, {'SHA': 'COMMIT_SHA3'}]
[{'SHA': 'COMMIT_SHA1'}]