2010-10-03 24 views
1

J'ai une instruction conditionnelle très longue pour décider quelle action prendre pour une paire de variables a et b.Refactoring de l'instruction longue en Python

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 

Il est agréable avec la compacité (en lignes;)) de cette déclaration, il doit exister une façon de faire plus élégant cela?

Répondre

9
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 

Des Zen of Python (extraits):

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

Les parenthèses sont également inutiles. – AndiDog

+0

@AndiDog: Merci, je ne les avais même pas regardés :) –

+0

Cette forme permet également de voir plus facilement que le cas '(a == 1 et b == 1)' a été omis. – PaulMcG

2

Si a et b ont tous deux connus, petites gammes entières, vous pourriez faire un dict. Dire qu'ils sont tous les deux toujours 0,1 ou 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) ] 

Mais cela est un peu opaque, infranchissable, et difficile à maintenir. Si la table d'action est grande et complexe et peut être générée par programmation, c'est une technique utile pour la boîte à outils.

+0

J'aime l'idée de la table de consultation, cependant, a et b peut (en théorie) prendre de grandes valeurs arbitraires. Je vais le garder en mémoire cependant. – Theodor