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
4 réponses
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)
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
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))
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
Questions connexes
De nouvelles questions
django
Django est un framework d'application Web open-source côté serveur écrit en Python. Il est conçu pour réduire l'effort requis pour créer des sites Web et des applications Web complexes axés sur les données, avec un accent particulier sur moins de code, pas de redondance et être plus explicite qu'implicite.