Django 想找更像蟒蛇的东西吗

Django 想找更像蟒蛇的东西吗,django,refactoring,python,Django,Refactoring,Python,这看起来很难看,有没有办法让它看起来更像蟒蛇 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'] == lat

这看起来很难看,有没有办法让它看起来更像蟒蛇

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

您所有的问题都源于
None
s。把它们清理干净,你的逻辑就变得微不足道了

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)

嗯,问题好像变了。添加最后一个
else:True
,可以将逻辑更改为

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

内部if/elif/else链可替换为and运算符和or运算符。每当您看到每个备选方案主体的
return True
return False
时,这种替换几乎是自动的

此外,对self.cleaned_数据有多个引用,可以通过以下因素进行分解:

cleaned = self.cleaned_data
我认为这个表达式是等效的(我无法测试它,因为我无法访问您的其余代码)。但是,它真的很长很难理解,如果我是你,我宁愿不去碰它:

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

更像蟒蛇?嗯,这到底是什么意思?@NickLH:Python程序员用它来表示“干净”或“惯用”,听起来很酷。+1我认为这是一个很好的问题。程序员的警钟响了,他试图利用语言特性以更简洁的方式编写代码。我不喜欢这个解决方案,因为它专门针对这个确切的代码片段。使用变量赋值、and/or运算符和分解公共子表达式的解决方案是完全通用的。此外,我仍然发现上面的“清理”代码比其他解决方案更难在精神上解析。我明白你的意思。如果值为
,则使其等于
,然后可以生成更清晰的逻辑。美好的保留“return True”意味着还剩下一个级别。是否希望通过使用额外的布尔运算符并可能在有意义的命名变量中保存中间分组来改进您的答案?此外,考虑删除Self.CuffEdId数据公共子表达式。(此外,如果你不能判断答案是否正确,那么答案也不是好的建议。)
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