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
这样的名称来更明确地说明其用途。
简单的问题 - 但我似乎无法通过 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
这样的名称来更明确地说明其用途。