Python 赋值语句中的短路被认为是好的风格吗?

Python 赋值语句中的短路被认为是好的风格吗?,python,Python,如果我理解正确的话 myvar = a and b or c 给出与相同的结果 if a: if b: myvar = b else: myvar = c else: myvar = c 所以我想它更优雅 我似乎记得在JavaScript代码中看到过这种短路赋值语句。但是在Python中,在赋值语句中使用短路被认为是一种好的风格吗?大多数情况下,您希望使用一个: 然而,短路是非常有害的,只需注意b为false-y的陷阱;在这种情况下,使用短路将导致不同的结果。大多

如果我理解正确的话

myvar = a and b or c
给出与相同的结果

if a:
  if b:
    myvar = b
  else:
    myvar = c
else:
  myvar = c
所以我想它更优雅


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

大多数情况下,您希望使用一个:

然而,短路是非常有害的,只需注意
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)

这确实是一个意见问题,但大多数情况下,答案是否定的。这与多种风格指南背道而驰,可能是因为人们倾向于认为它的意思是“如果a是真的,使用b的值,否则使用c的值”,而不是你发布的真正含义

您可能需要使用新的ish条件表达式语法:

myvar = b if a else c

在Javascript中使用它的事情在Python中通常不那么重要。我经常使用
a=b或c
,但对于更复杂的表单,我可能会写得更清楚一些。@user2357112您能举个例子吗?@KnewB:您不需要太多的检测对象是否支持某些方法,当您这样做时,您通常会捕获
类型错误
属性错误
<如果
foo
没有
bar
属性,则code>foo.bar不会在Python中给出
undefined
。您不需要检测用户的Python解释器是否支持
”。在使用它之前加入它。这与OP给出的表达式并不完全相同
b=0
将在OP的版本中产生
myvar=c
,而这里
myvar
将获得
b
的值@HenryKeiter:准确。大多数情况下,这不是你想要的。但是OP的第二个例子似乎清楚地表明,这就是他想要的。在这种情况下,不是吗?@HenryKeiter:不,这表明OP非常理解这个表达,这是罕见的。我更明确地说,在大多数情况下,条件表达式更好,因为大多数人都没有意识到这个问题。。。现在我认为它是等价的
myvar = b if a else c