在Python中重构长语句

在Python中重构长语句,python,refactoring,if-statement,conditional,Python,Refactoring,If Statement,Conditional,我有一个很长的条件语句,用于决定对变量a和b采取什么操作 action = 0 if (a==0) else 1 if (a>1 and b==1) else 2 if (a==1 and b>1) else 3 if (a>1 and b>1) else -1 线条紧凑,美观大方;对于这种说法,它一定存在一种更优雅的方式来做到这一点吗 if a==0: action = 0 elif a>1 and b==1: action = 1 elif a==

我有一个很长的条件语句,用于决定对变量a和b采取什么操作

action = 0 if (a==0) else 1 if (a>1 and b==1) else 2 if (a==1 and b>1) else 3 if (a>1 and b>1) else -1
线条紧凑,美观大方;对于这种说法,它一定存在一种更优雅的方式来做到这一点吗

if a==0:
   action = 0
elif a>1 and b==1:
   action = 1
elif a==1 and b>1:
   action = 2
elif a>1 and b>1:
   action = 3
else:
   action = -1
摘录如下:

Simple is better than complex.
Flat is better than nested.
Readability counts.
摘录如下:

Simple is better than complex.
Flat is better than nested.
Readability counts.

如果a和b都有已知的小整数范围,你可以做一个dict。假设它们总是0、1或2:

actionTable = { (0,0): 0, (0,1): 0, (0,2): 0,
                (1,0):-1, (1,1):-1, (1,2): 2,
                (2,0):-1, (2,1): 1, (2,2): 3 }

return actionTable[ (a,b) ]

但这有点不透明,不可缩放,很难维护。但是,如果动作表大而复杂,并且能够通过编程生成,那么它是工具箱的一种有用技术。

如果a和b都具有已知的小整数范围,则可以创建一个dict。假设它们都始终为0、1或2:

actionTable = { (0,0): 0, (0,1): 0, (0,2): 0,
                (1,0):-1, (1,1):-1, (1,2): 2,
                (2,0):-1, (2,1): 1, (2,2): 3 }

return actionTable[ (a,b) ]

但这有点不透明,不可缩放,很难维护。如果动作表很大、很复杂,并且可以通过编程方式生成,那么它对工具箱来说是一种很有用的技术。

括号也是不必要的。@AndiDog:谢谢,我甚至没有看过它们:这种形式也使我们更容易看到省略了a==1和b==1的情况。非常简洁。这就是我的代码在我开始摆弄它之前的样子,最后使用超长语句=@Andi圆括号使其更具可读性@Paul a==1和b==1在国际上被省略了-它被else-1覆盖了,尽管这很好,但它并不明显。@Theodor:你已经知道了:Python让编写好代码变得很自然。如果您需要添加一些内容以使其更具可读性,比如三元运算符级联中的括号,您可能需要重新考虑您正在做的事情:括号也是不必要的。@AndiDog:谢谢,我甚至没有看过它们:这种形式还可以更容易地看到省略了a==1和b==1的情况。非常简洁。这就是我的代码在我开始摆弄它之前的样子,最后使用超长语句=@Andi圆括号使其更具可读性@Paul a==1和b==1在国际上被省略了-它被else-1覆盖了,尽管这很好,但它并不明显。@Theodor:你已经知道了:Python让编写好代码变得很自然。如果您需要添加一些内容以使其更具可读性,比如三元运算符级联中的括号,您可能需要重新考虑您正在做的事情:我喜欢查找表的想法,但是,理论上a和b可以取任意大的值。不过我会把它保存在内存中。我喜欢查找表的想法,但是,a和b在理论上可以取任意大的值。不过我会记住的。