Cela a l'air vraiment moche, y a-t-il un moyen de le rendre plus pythonique?

if self.cleaned_data['string1_val'] == '' and latestSI.string1_val is None :
    if self.cleaned_data['string2_val'] == '' and latestSI.string2_val is None :
        return False
    elif self.cleaned_data['string2_val'] == latestSI.string2_val :
        return False
    else:
        return True
elif self.cleaned_data['string1_val'] == latestSI.string1_val :
    if self.cleaned_data['string2_val'] == '' and latestSI.string2_val is None :
        return False
    elif self.cleaned_data['string2_val'] == latestSI.string2_val :
        return False
    else:
        return True
else:
    return True
2
Sevenearths 1 nov. 2011 à 04:19

4 réponses

Meilleure réponse

Tous vos problèmes proviennent de None. Nettoyez-les et votre logique devient triviale.

cd1 = self.cleaned_data['string1_val']
lsi1 = latestSI.string1_val
cd2 = self.cleaned_data['string2_val']
lsi2 = latestSI.string2_val
if lsi1 is None:
  lsi1 = ''
if lsi2 is None:
  lsi2 = ''
return not (cd1 == lsi1 and cd2 == lsi2)
1
Ignacio Vazquez-Abrams 1 nov. 2011 à 00:28

Je pense que cette expression est équivalente (je ne peux pas la tester, car je n'ai pas accès au reste de votre code). Mais, c'est vraiment long et difficile à comprendre, je préfèrerais ne pas le toucher si j'étais vous:

if (self.cleaned_data['string1_val'] == latestSI.string1_val) or (not self.cleaned_data['string1_val'] and not latestSI.string1_val):
    return (not self.cleaned_data['string2_val'] or not latestSI.string2_val) and self.cleaned_data['string2_val'] != latestSI.string2_val
else:
    return True
1
Óscar López 1 nov. 2011 à 00:54
def eq(x,y):
    return x == ('' if y is None else y)

if eq(self.cleaned_data['string1_val'],latestSI.string1_val):
    return not eq(self.cleaned_data['string2_val'],latestSI.string2_val)

Hm. Il semble que la question ait changé. Avec l'ajout du else: True final, la logique peut être changée en

return not (eq(self.cleaned_data['string1_val'],latestSI.string1_val)
            and eq(self.cleaned_data['string2_val'],latestSI.string2_val))
2
unutbu 1 nov. 2011 à 01:10

Les chaînes internes if / elif / else peuvent être remplacées par l'opérateur and et l'opérateur or. Cette substitution devrait être presque automatique chaque fois que vous voyez return True et return False pour le corps de chaque alternative.

En outre, il existe plusieurs références à self.cleaned_data qui peuvent être factorisées avec:

cleaned = self.cleaned_data
0
Raymond Hettinger 1 nov. 2011 à 00:36
7961216