这个作业中的逗号是做什么的?

What is the comma doing in this assignment?

我对 Python 语法不是很熟悉,想知道是否有人可以向我解释变量 match 是如何处理在 for 表达式中找到的字符串的这个函数:

def find_project(project_name):    
    projects = get_projects()    
    try:
        match, = (proj for proj in projects if proj["name"].strip() == project_name)
        return match
    except ValueError:
        return None

Python 允许您一次分配多个变量,如下所示:

a, b = 1, 2

其工作方式是将赋值 a, b 的左侧视为一个元组,并将右侧元组 1, 2 中的每个元素赋值给它。

因为元组只能有一个元素,所以下面的方法也有效:

a, = 1,

多重赋值的右侧不一定是元组。只要每边的元素数量相同,任何迭代都可以:

a, b, c = "three little pigs".split()

如果元素数量不匹配:

a, b, c = "oh", "no"

...你得到一个 ValueError:

ValueError: not enough values to unpack (expected 3, got 2)

将以上所有内容放在一起,则您的函数:

def find_project(project_name):    
    projects = get_projects()    
    try:
        match, = (proj for proj in projects if proj["name"].strip() == project_name)
        return match
    except ValueError:
        return None

... 遍历 generator expression

(proj for proj in projects if proj["name"].strip() == project_name)

... 如果结果有一个元素,则将该元素分配给 match。如果不是,则引发 ValueError(并被 except 子句捕获),不会发生赋值,并返回 None

注意两点:

  1. 逗号,阅读代码时容易漏掉。另一种方法是在左侧使用列表语法:

    [match] = (proj for proj in projects if proj["name"].strip() == project_name)
    

    ...效果相同

  2. 当右侧是生成器表达式(或其他类型的 iterator), you can use next() 且具有默认值时:

    def find_project(project_name):    
        projects = get_projects()    
        it = (proj for proj in projects if proj["name"].strip() == project_name)
        return next(it, None)
    

    ...更短且更易读。