2016-04-25 33 views
1

我知道Python的分配条件LHS

a = val1 if condition else val2 

,但有没有办法做到像

a if condition else b = val 

会抛出一个SyntaxError(这是可以理解的,我想)

我将使用条件,

if condition: 
    a = val 
else: 
    b = val 

但我讨厌在我的程序中有两个相同的代码(在这里,右边)两次(在我的真实代码中,val是一个不平凡的表达式)。我知道我可以制作一个虚拟变量来保存这部分内容,但这似乎不符合惯例。

它也发生在我做一个元组

ba = (b,a) 
ba[bool(condition)] = val 
b, a = ba 

但也显得非常不地道。

有没有另一种方法,我没有想到?

+0

'A,b = VAL,b如果COND ELS e a,val'是一行,但仍然重复'val'。 –

+0

这是一个奇怪的要求。将非平凡表达式的结果分配给相应命名的变量是一种更好的做法。例如。 topTenDebtCustomers或其他。然后,您可以像在if/else语句中那样将该值分配给“a”或“b”,这是正确的方式。这不是一个“虚拟”变量,不是非惯用的,恰恰相反。您希望消除命名变量以保存一行代码,这使您成为一个糟糕的程序员。 – aaa90210

+0

@aaa在使我问这个问题的情况下,'val'的含义完全由'condition'确定。所以没有语义上有效的标签(除了'maybe_a_maybe_b'之外)。这是一个彻头彻尾的情况,但我想知道人们认为正确的方式是什么。当然,情况经常如此,我最终采取了完全不同的方法,而不需要这样做。尽管如此,它在理论上可能会发生。 – phsyron

回答

1

您可以使用一个函数来封装逻辑和解压回你感兴趣的变量:

def decider(x, y, condition, val): 
    if condition: 
     return val, y 
    return x, val 

a, b = decider(a, b, cond, value) 
1

不,你不能那样做。使另一个变量保持val并使用if。简单很好。

1

这是可行与元组一行:

a,b = val if cond else a, val if not cond else b 

但请不要使用它,它的丑陋,很多是纯if声明更加复杂。

+1

很hacky,但它的作品。可以缩写为'(a,b)=(val,b)如果条件else(a,val)' – smac89

+1

另外,你重复了更多的代码。现在'cond'也会出现两次。 – user2357112

0

如果ab有一些以前的值,你可以简单地写:

a, b = (a, val) if condition else (val, b) 

否则你可以写

a, b = (None, val) if condition else (val, None)