【问题标题】:Omitting repetition in long statements在长语句中省略重复
【发布时间】:2018-10-19 20:55:18
【问题描述】:

我有一个很长的声明:

if LongClassName.results[variable1][longerVariable2][variable3] == 0:
   LongClassName.results[variable1][longerVariable2][variable3] = 42

可以清楚地看到,这段代码中有很多重复(条件和正文中使用了相同的表达式)。有没有办法简化它?在 C++ 中,我可以使用引用,如下所示:

auto &ref = LongClassName.results[variable1][longerVariable2][variable3];
if (ref == 0) {
    ref = 42;
}

简化这个表达式的 Pythonic 方式是什么?

【问题讨论】:

  • 声明、引用和设置变量(大部分)与语言无关 > pythonforbeginners.com/basics/python-variables
  • @Robin(和 @RandomUs1r):Python 没有引用,所以 ref = 42 不能满足您的建议。
  • 如 in this answer 所述,这是 Pythonic 的显式方式。
  • @martineau - 对不起,是的,你是对的。我没有注意到正在进行的实际任务。

标签: python python-3.x


【解决方案1】:

您可以停止并获取高于此级别的参考:

partial_ref = LongClassName.results[variable1][longerVariable2]
if partial_ref[variable3] == 0:
   partial_ref[variable3] = 42

这不是特别 Pythonic,但它最接近您的原始 C++ 代码。

【讨论】:

    【解决方案2】:

    你可以把它缩短到这样的程度:

    container = LongClassName.results[variable1][longerVariable2]
    if container[variable3] == 0:
       container[variable3] = 42
    

    Python 不像 C++ 那样具有完全通用的引用,因此这会为 variable3 的容器创建一个较短的名称,并在后续语句中使用它的名称。

    【讨论】:

      【解决方案3】:
      x = LongClassName.results[variable1][longerVariable2]
      if x[variable3] == 0:
         x[variable3] = 42
      

      这可行,但看起来不是很优雅。

      【讨论】:

      • @jasonharper:海报改变了他们的回答,因为你发表了你的评论——所以它现在就像其他人一样,并且会真正起作用。
      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多