有时我将if
的长条条件分红几行。 最明显的方法是: app
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
在视觉上不是很吸引人,由于动做与条件融为一体。 可是,这是使用正确的4个空格的Python缩进的天然方法。 spa
目前,我正在使用: code
if ( cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
但这不是很漂亮。 :-) ci
您能推荐一种替代方法吗? get
就我的而言,我喜欢在长if语句中添加含义。 我将不得不搜索代码以找到合适的示例,但这是我想到的第一个示例:假设我碰巧遇到了一些古怪的逻辑,我想根据许多变量来显示特定页面。 io
英语:“若是登陆的用户不是管理员教师,而是普通教师,而不是学生自己...” 登录
if not user.isAdmin() and user.isTeacher() and not user.isStudent(): doSomething()
固然,这看起来不错,可是若是须要大量阅读,请阅读这些内容。 咱们如何将逻辑分配给有意义的标签。 “标签”其实是变量名: 变量
displayTeacherPanel = not user.isAdmin() and user.isTeacher() and not user.isStudent() if displayTeacherPanel: showTeacherPanel()
这可能看起来很愚蠢,可是您可能还有另外一种状况,您仅在如下状况下才要显示其余项目:(仅当您正在显示教师面板时)或者默认状况下用户能够访问该其余特定面板: 搜索
if displayTeacherPanel or user.canSeeSpecialPanel(): showSpecialPanel()
尝试在不使用变量来存储和标记逻辑的状况下编写上述条件,不只会获得很是混乱且难以理解的逻辑语句,并且还会重复本身。 尽管有合理的例外状况,但请记住:不要重复本身(DRY)。 bug
这并无太大改善,可是...
allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4') if allCondsAreOK: do_something
您不须要在第二条条件行上使用4个空格。 可能使用:
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
另外,不要忘记空白比您想象的更灵活:
if ( cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4' ): do_something if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
二者都至关丑陋。
也许丢了括号(尽管《 风格指南》不鼓励这样作)?
if cond1 == 'val1' and cond2 == 'val2' and \ cond3 == 'val3' and cond4 == 'val4': do_something
这至少使您不同凡响。
甚至:
if cond1 == 'val1' and cond2 == 'val2' and \ cond3 == 'val3' and \ cond4 == 'val4': do_something
我想我更喜欢:
if cond1 == 'val1' and \ cond2 == 'val2' and \ cond3 == 'val3' and \ cond4 == 'val4': do_something
这是《 样式指南》 ,(自2010年起)建议使用括号。
我建议将and
关键字移到第二行,并将包含条件的全部行缩进,而不是两个空格:
if (cond1 == 'val1' and cond2 == 'val2' and cond3 == 'val3' and cond4 == 'val4'): do_something
这正是我在代码中解决此问题的方式。 将关键字做为该行的第一个单词可使条件更具可读性,而且减小空格的数量进一步将条件与操做区分开。
当我有一个很是大的if条件时,我更喜欢这种风格:
if ( expr1 and (expr2 or expr3) and hasattr(thingy1, '__eq__') or status=="HappyTimes" ): do_stuff() else: do_other_stuff()