python 多重赋值的可读性

python multiple assignment readability

简单的问题 - 但我似乎无法通过 google...

找到任何东西

假设我有两个独立设置的变量。 它们应该具有相同的值。现在这两个变量发现自己在一个新函数中,准备合并。

首先我想确定它们是一样的。 然后我想将第三个变量(id)设置为两个(id_1,id_2)的值,以使代码更清晰。

id_1=5
id_2=5

# ensure id_1==id_2
assert id_1 == id_2

id=id_1 # option 1
id=id_2 # option 2
id=id_1=id_2 # option 3

正确的 'pythonic' 方法是什么? 什么是最可读的?还是有更好的方法来完成这个(并扩展到 > 2 个初始变量)?以前我用过(选项#1)。

def f(*args):
    if args[1:] == args[:-1]: #test all args passed are equal
        id = args[0] #set your 'id' to the first value
    else:
        return None # just as an example
    # do things ...
    return id

>>> f(1,2,3,4)
None
>>> f(1,1,1,1)
1

我会做:

try:
    id = id1 if id1==id2 else int('')
except ValueError as e:
    #fix it or
    raise ValueError('id1 and id2 are different.') from e

对于多个值:

try:
    id = args[0] if len(set(args))==1 else int('')
except ValueError as e:
    #fix it or
    raise ValueError('id1 and id2 are different.') from e

我通常保留 assert 用于调试目的,因此使用 try 语句。

我会将您的其他函数定义为获取一个列表,而不是一堆您并不真正需要的变量,然后使用 any 来检查它们是否全部匹配。您不需要将每个值与其他所有值进行比较,只需将第一个值与所有其他值进行比较即可:

id, *rest = list_of_values # this is Python 3 syntax, on earlier versions use something
                           # like `id, rest = list_of_values[0], list_of_values[1:]`
assert(all(id == other_id for other_id in rest))

# do stuff here with `id`

请注意,id 并不是一个真正适合变量的名称,因为它也是一个内置函数的名称(您的代码将无法使用它,因为它的名称将被隐藏) .如果您的 id 代表某种特定类型的对象,您可以使用 foo_id 这样的名称来更明确地说明其用途。