【问题标题】:Is short-circuiting in assignment statements considered good style?赋值语句中的短路是否被认为是好的风格?
【发布时间】:2023-03-16 06:30:02
【问题描述】:

如果我理解正确

myvar = a and b or c

给出与

相同的结果
if a:
  if b:
    myvar = b
  else:
    myvar = c
else:
  myvar = c

所以我想它更优雅。

我似乎记得在 JavaScript 代码中看到过这种短路赋值语句。但是在 Python 中,在赋值语句中使用短路是否被认为是一种好的风格?

【问题讨论】:

  • 你在 Javascript 中使用它的东西在 Python 中通常不是那么重要。
  • 我经常使用a = b or c,但对于更复杂的表格我可能会写得更清楚。
  • @user2357112 你能举个例子吗?
  • @KnewB:您不需要检测对象是否支持某些方法,当您这样做时,通常会捕获TypeErrorAttributeError。如果foo 没有bar 属性,foo.bar 在 Python 中不会给出 undefined
  • 使用前不需要检测用户的Python解释器是否支持''.join

标签: python


【解决方案1】:

大多数时候,您想使用 conditional expression 代替:

myvar = b if a else c

但是,短路是非常 Pythonic 的,请注意 b 为 false-y 的陷阱;在这种情况下,使用短路将导致 不同 结果。大多数时候,您确实不想改为指定c

即使在这种情况下,您仍然可以通过调整条件获得相同的结果:

myvar = b if a and b else c

短路非常适合默认设置:

foo = somevar or 'bar'

或确保满足先决条件:

foo = somevar and function_raises_exception_if_passed_empty_value(somevar)

【讨论】:

  • 这并不完全等同于 OP 给出的表达式。 b=0 将导致 OP 版本中的myvar=c,而这里myvar 将获得b 的值。
  • @HenryKeiter:没错。大多数时候这不是你想要的。
  • 但是 OP 的第二个例子似乎清楚地表明这就是他在这种情况下想要的,不是吗?
  • @HenryKeiter:不,这表明 OP 非常了解该表达式,这很少见。我更明确地说,条件表达式在大多数情况下更好,因为大多数人意识到这个问题。
  • 很容易b if a and b else c ...现在我认为它是等价的
【解决方案2】:

这确实是一个意见问题,但在大多数情况下,答案是否定的。它违反了多个样式指南,可能是因为人们倾向于认为它的意思是“如果 a 为真,则使用 b 的值,否则使用 c 的值”而不是真正的含义,这就是您发布的内容。

您可能想要新的条件表达式语法:

myvar = b if a else c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多