【问题标题】:python multiple assignment readabilitypython多重赋值可读性
【发布时间】:2016-05-19 23:42:00
【问题描述】:

简单的问题 - 但我似乎无法通过谷歌找到任何东西......

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

首先我想确保它们是相同的。 然后我想将第三个变量(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)。

【问题讨论】:

  • 我可能只使用两个初始变量之一。
  • 如果它们不一样,你想抛出错误,还是只设置一个具有另一个的值?
  • 我要求它们相同。 assert 语句将确保(并退出)。所以我想确保它们是相同的,如果是,那么将一个新变量设置为另外两个的值。
  • 不要使用选项 3。当 id_1 已经拥有所需的值时,分配给它是没有意义的。你为什么会考虑这个选项?

标签: python assertion


【解决方案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

【讨论】:

  • 是的,这很有用,但您的回答还包括我所问问题的示例。此行id = args[0]。在所有值都被认为相同之后做出假设,我们只需将 id 设置为等于其他变量之一。我的问题是是否有更好的方法来处理这种类型的逻辑,同时尽量提高可读性。
  • 这是我的答案......就像,这就是我要做的:)
  • 谢谢 - 看起来没有办法解决这个问题(将新值设置为其他变量之一)。接受您的回答,因为它是最清晰/可扩展的。
【解决方案2】:

我会将您的其他函数定义为获取一个列表,而不是一堆您并不真正需要的变量,然后使用 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 并不是一个真正适合变量的名称,因为它也是一个内置函数的名称(您的代码将无法使用它,因为它的名称会被隐藏)。如果您的 ids 代表某种特定类型的对象,您可以使用像 foo_id 这样的名称来更明确地说明其用途。

【讨论】:

    【解决方案3】:

    我愿意:

    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 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2023-03-04
      • 2018-08-13
      • 2014-04-12
      • 1970-01-01
      • 2015-09-18
      • 2012-06-16
      相关资源
      最近更新 更多