在“ if”语句中设置多行条件的样式?[关闭]


675

有时我将ifs中的长条条件分解为几行。最明显的方法是:

  if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something

在视觉上不是很吸引人,因为动作与条件融为一体。但是,这是使用正确的4个空格的Python缩进的自然方法。

目前,我正在使用:

  if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something

但这不是很漂亮。:-)

您能推荐一种替代方法吗?


2
如果您的编辑器使用pep8 Python软件包来检测何时发出有关PEP8违规的警告,则必须禁用E125错误或找到满足pep8软件包标准的格式化解决方案。该pep8包装的问题#126是关于包固定在严格遵循PEP8规范。关于该问题的讨论包括一些样式建议,这些建议也可以在此处看到。
akaihola

1
请注意,对于第一个示例,pep8将抛出“ E129视觉缩进的行,其缩进与下一条逻辑行的缩进”。
泰勒·埃德米斯顿,2016年

这个问题很老,有很多观点,但毫无疑问是基于观点的。语言“不是很吸引人”和“不是很漂亮”提出了这样的标准,即所谓的正确答案是最能与提问者的审美偏好(即观点)保持一致的答案。我可能会问完全相同的问题,并声称它不是重复的,因为我的审美品味使它成为不同的东西,并且会导致不同的“正确”答案。
Z4层

@ Z4层:是的,基于意见。但这是在12年前提出的。所以那时是一个不同的,更友善的地方。由于SO的标准已发生更改,因此最近它一直在积累反对意见。尽管如此,在被浏览超过100万次之后,我希望它在世界上的好处多于危害。我当然可以看到人们今天对相同的问题感到疑惑,在谷歌上搜索它,进入讨论并发现对校准他们的想法很有用。有几个高度投票的答案可供选择。
Eli Bendersky,

@EliBendersky完全同意。这就像SO持续存在身份危机:虽然它显然不符合“规则”(有效答案的数量证明了这一点),但很显然,它可以增加价值。在所有事情都平等的情况下,即使他们的观点与我的观点有所不同,我还是希望与对编码风格提出明确和合理观点的人一起工作。
Z4层

Answers:


748

您不需要在第二条条件行上使用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年起)建议使用括号。


45
请注意,PEP 8不建议使用尾随\解决方案。一个原因是,如果在\之后错误添加空格,则它可能不会在编辑器中显示,并且代码在语法上变得不正确。
Eric O Lebigot

14
这是错误的,样式指南说:“可以通过将表达式包装在括号中来将多行折断成多行。应优先使用反斜杠以使行连续。” 您可以在这里看到:python.org/dev/peps/pep-0008/#maximum-line-length
joshcartme 2013年

8
@joshcartme PEP在hg.python.org/peps/rev/7a48207aaab6处进行了更改,以明确阻止反斜杠。我将更新答案。
哈雷·霍尔科姆

3
谢谢,更新您的示例也是个好主意,因为现在不建议使用它们。我试图自己弄清楚这一点,并为您的答案和样式指南之间的差异感到困惑(因此请发表评论)。我不只是想做书呆子。
joshcartme

3
现在,PEP 8不鼓励在and和之后中断if
virtualxtc

124

在简并的情况下,我采用了以下内容:简而言之,其为AND或OR。

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

它可以刮掉几个字符,并清楚表明该条件没有任何微妙之处。


4
这是一个有趣的方法。虽然并不能解决长期条件的问题
Eli Bendersky

20
如果您不关心短路也可以。
康斯坦丁

63
短路并不总是很快。虽然不是很好的编码实践,但是您可能已有这样的现有代码:if destroy_world and DestroyTheWorld() == world_is_destroyed: ...。太好了,现在您只是偶然地毁了世界。你怎么能?
亚伦

4
我很惊讶这有这么多赞成票。该答案完全忽略了有关设置多行条件样式的原始问题。
Przemek D

2
这种表达并不懒惰。因此,如果在某些保护条件之后可能导致故障,则并不等同。
eugene-bright

56

有人必须在这里提倡使用垂直空格!:)

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

这使得每个条件都清晰可见。它还可以更清晰地表达更复杂的条件:

if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

是的,为了清楚起见,我们将权衡一些垂直房地产。IMO值得。


19
这似乎并不漂亮,也不与PEP8兼容。PEP8说,绕开二进制运算符(例如andor)的首选位置是运算符之后,而不是在它之前。
克里斯·梅德雷拉

7
@ChristopherMedrela能否说明其背后的原理?我认为在逻辑运算符之前放置换行符更加清晰
Norill Tempest 2014年

4
在节点的世界中,将操作者放在首位是很常见的。这样做的理由是,至少在西方文化中,我们注意到和阅读左侧的内容比右侧的内容要快得多。在JavaScript中非常有效,在JavaScript中被遗忘的逗号会导致无提示错误。
tomekwi 2014年

11
请不要这样做。不仅如此,PEP8而且使确定链接的逻辑操作更加困难。如果通过代码审查来到我的办公桌前,我将无法做到这一点。
Urda

11
从PEP8的当前版本开始,在二进制运算符之前或之后中断被认为是可以接受的,并且在新代码被认为更好之前要中断。
索伦·比约恩斯塔德

31

当我有一个非常大的if条件时,我更喜欢这种风格:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()

2
+1用于保持缩进位置,您可以在其中跟踪它们。我喜欢python并经常使用它,但是我一直被迫如此缩进而感到烦恼。即使做得好,多线产品也确实会破坏美观。
13

4
请注意,将您的andor运算符放在该行的开头会违反PEP 0008,该声明指出“绕开二进制运算符的首选位置是在运算符之后,而不是在运算符之前。” 。不过,我喜欢将右括号和冒号放在自己的行上,以将if条件与主体分开(并且完全有可能做到这一点,同时让布尔运算符保持在行的末尾以符合PEP-0008的要求)。
Mark Amery

8
自2016年起:For decades the recommended style was to break after binary operators. But this can hurt readability in two ways... In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.(Knuth的风格是从运算符开始)。
考伯特

27

这是我非常个人的看法:(在我看来)长时间条件是一种代码气味,建议将其重构为布尔返回函数/方法。例如:

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

现在,如果我找到一种使多行条件看起来不错的方法,那么我可能会发现自己对满足这些条件感到满意,而无需进行重构。

另一方面,让它们扰乱我的审美意识可以促进重构。

因此,我的结论是,多个线路条件看起来很丑陋,这是避免它们的诱因。


23

这并没有太大改善,但是...

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something

1
有趣的选择。但是还有2条额外的线:-)
Eli Bendersky

真的不会在迭代循环中很好地工作,也不会与函数一起执行某些工作……并且公平地说-丑陋
Mez

9
布莱恩,我部分不同意。将变量用于计算的中间结果可以使代码更易于理解,并且使用编译语言不会对性能产生任何影响。它可能会在python中完成,尽管如果性能如此重要,我将完全不使用python。
Mark Ba​​ker

1
@MarkBaker我曾经同意您所写的内容,直到我读了Martin Fowlers的“重构”。他提供了一个极好的论据,认为这种中间变量造成的危害大于收益。它们抑制后续的重构。不使用它们会导致功能更丰富的编程风格,这很适合重构。这让我感到惊讶,但我相信他是对的,并且自那时以来就努力从我的代码中消除像这样的不必要的中间件-即使它们被多次使用。
乔纳森·哈特利

2
好,但是为什么要使用驼峰箱?:)
Leonid Shvechikov

19

我建议将and关键字移至第二行,并将包含条件的所有行缩进,而不是四个空格:

if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something

这正是我在代码中解决此问题的方式。将关键字作为该行中的第一个单词使该条件更具可读性,并且减少空格的数量进一步将条件与动作区分开。


9
我在Gries或Djikstra的某个地方读到,将逻辑运算符放在行的最前线(使它更明显)对您有所帮助。自90年代以来,我一直在这样做。它会有所帮助。
S.Lott

7
请注意,《风格指南》建议将条件句放在行尾。
哈雷霍尔科姆

3
是的,尽管我从未对此表示同意。毕竟,这只是一个指南。
DzinX

8
PEP8 不再建议将条件语句放在行尾。
索伦·比约恩斯塔德

14

似乎值得引用PEP 0008(Python的官方样式指南),因为它以适度的长度评论了这个问题:

当- if语句的条件部分足够长以至于需要将其写成多行时,值得注意的是,两个字符关键字(即if),一个空格和一个左括号的组合会产生自然的4-多行条件的后续行的空格缩进。这可能与嵌套在if-statement中的缩进代码套件产生视觉冲突,该缩进代码套件自然也会缩进4个空格。对于如何(或是否)在视觉上进一步将这些条件行与if-statement 内的嵌套套件区分开,此PEP没有明确的位置。在这种情况下,可接受的选项包括但不限于:

# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

注意上面引用中的“不限于”;除了在样式指南中建议的方法外,在此问题的其他答案中建议的一些方法也是可以接受的。


PEP8 +1。这应该被接受,因为(实际上)它是官方的Python样式指南。
Michael-Clay Shirky在哪里,2013年

2
同样值得强调的是,PEP8明确声明其立场,因为该PEP在如何(或是否)进一步从视觉上区分这些条件行与if语句内的嵌套套件方面没有明确立场。在这种情况下,可接受的选项包括但不限于:...(已 摘要因此,不要争论,选择喜欢的东西!
RayLuo

7

这就是我的工作,请记住“ all”和“ any”接受迭代,因此我将一个长条件放在列表中,然后让“ all”完成工作。

condition = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']

if all(condition):
   do_something

4

我很惊讶没有看到我的首选解决方案,

if (cond1 == 'val1' and cond2 == 'val2'
    and cond3 == 'val3' and cond4 == 'val4'):
    do_something

由于and是一个关键字,因此我的编辑器将其突出显示,并且看起来与其下方的do_something完全不同。


但是延续线仍然不能与下一条逻辑线区分开来……
克里斯·梅德雷拉

1
请注意,这是对PEP 0008的违反(“绕开二进制运算符的首选位置是在运算符之后,而不是在运算符之前”)。您是否在乎,当然取决于您。
Mark Amery

1
顺便说一句,这不再是我的首选解决方案。;)
Marius Gedminas 2015年

4

加上@krawyoti所说的话...长时间的气味会散发出来,因为它们难以阅读且难以理解。使用函数或变量可使代码更清晰。在Python中,我更喜欢使用垂直空间,将括号括起来,并将逻辑运算符放在每行的开头,以使表达式看起来不像“浮动”。

conditions_met = (
    cond1 == 'val1' 
    and cond2 == 'val2' 
    and cond3 == 'val3' 
    and cond4 == 'val4'
    )
if conditions_met:
    do_something

如果需要多次评估条件(例如在while循环中),则最好使用局部函数。


1
除此之外,您可以声明一个函数或一个lambda来返回true,而不是创建一个额外的变量。
Techdragon

@Techdragon如果条件在其他地方,则将其放入lambda块将需要命名lambda块,以便稍后可以在if条件中引用。如果要命名lambda,那么为什么要命名而不是常规函数呢?我个人喜欢这种简化的布尔表达式。
Sri Kadimisetty

我同意,这就是为什么我通常在大多数情况下都使用一个函数来提高可读性和在浏览以了解程序控制流程时简化精神消化的原因。我提到了lambda,以确保在人们特别注重空间的情况下也可以使用“较小”选项。
Techdragon

4

就个人而言,我喜欢在长if语句中添加含义。我将不得不在代码中进行搜索以找到合适的示例,但这是我想到的第一个示例:假设我碰巧遇到了一些古怪的逻辑,我想根据许多变量来显示特定页面。

英语:“如果登录的用户不是管理员教师,而是普通教师,而不是学生本身...”

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)。


3

“ all”和“ any”对于相同类型案例的许多条件都很好。但是他们总是评估所有条件。如本例所示:

def c1():
    print " Executed c1"
    return False
def c2():
    print " Executed c2"
    return False


print "simple and (aborts early!)"
if c1() and c2():
    pass

print

print "all (executes all :( )"
if all((c1(),c2())):
    pass

print

5
不对!他们这样做是因为这样做。尝试在[c1,c2]中使用all(f()for f)。
哈比人2009年

2
我认为他只是以函数为例,因为他可以轻松地使函数打印某些内容。如果我们考虑到列表中提供的一系列任意表达式,all()那么除非您将每个表达式都包装在lambda中并使用f()技巧,否则它们都将被求值。换句话说,亚伦(Aaron):我认为安德斯(Anders)试图以可调用对象为例,来讨论一般条件。但您的重新加入仅适用于功能。
布兰登·罗德斯

3

(我对标识符进行了小幅修改,因为固定宽度的名称不代表真实代码-至少不代表我遇到的真实代码-这将掩盖示例的可读性。)

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

这对于“ and”和“ or”非常有效(重要的是它们排在第二行),但对于其他较长条件则远不如此。幸运的是,前者似乎是更常见的情况,而后者通常很容易用一个临时变量重写。(通常并不难,但是在重写时保留“和” /“或”的短路可能很困难或不太明显/可读性。)

由于我从您的博客文章中找到了有关C ++的问题,因此我将介绍我的C ++样式是相同的:

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4") {
    do_something
}

3

简单明了,还通过了pep8检查:

if (
    cond1 and
    cond2
):
    print("Hello World!")

近年来,我一直偏爱alland any函数,因为我很少将And和Or混合使用,因此效果很好,并且具有生成器理解失败的额外优势:

if all([
    cond1,
    cond2,
]):
    print("Hello World!")

只记得传递一个可迭代的值!传递N参数是不正确的。

注意:any就像很多or比较,all就像很多and比较。


这与生成器理解很好地结合在一起,例如:

# Check if every string in a list contains a substring:
my_list = [
    'a substring is like a string', 
    'another substring'
]

if all('substring' in item for item in my_list):
   print("Hello World!")

# or

if all(
    'substring' in item
    for item in my_list
):
    print("Hello World!")

更多信息:生成器理解


1
我还应该指出,pylint的库存配置需要在if中的在线继续中进行缩进。这使我无法使用此方案。
ThorSummoner '16

2

如果我们仅在条件和身体之间插入一条额外的空白行,而其余部分以规范的方式进行,该怎么办?

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):

    do_something

ps我总是使用制表符,而不是空格。我无法微调...


3
我认为这将非常令人困惑,尤其是当条件的主体较长时。
伊莱·班

我同意Eli的观点,此处的封装和缩进对于较长的行造成了混淆。此外,新规则andand or语句应从下一行开始
virtualxtc

2

我通常要做的是:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something

这样,右括号和冒号在视觉上标志着我们病情的结束。


1
几乎正确;现在,PEP 8建议在and或之前中断or
virtualxtc

2

也为if语句提供多条件的所有受访者与所提出的问题一样丑陋。您不能通过做同样的事情来解决此问题。

甚至PEP 0008的答案也是令人反感的。

这是一种更具可读性的方法

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

要我吃我的话吗?说服我,您需要多条件,并且我会逐字打印出来,并出于娱乐目的而食用。


这确实是进行多条件操作的一种非常巧妙的方法:)不知道为什么它没有更多的票数:),有什么警告吗?
dim_user

@SaulCruz确实不存在,不仅不需要重复条件变量,而且还保存了检查每个值的许多重复项,这只是将值仅放入数组中,并让引擎执行它的(优化)工作。为您检查情况
-Stoff

@Stoff感谢您删除我的评论。我想指出,您的方法无法回答OP的问题。您提供的代码无法应用于问题中的代码。如果您不这样认为,则应添加按您的方法重新格式化的OP代码以证明您的观点。
Jeyekomon

这不是公认的答案,但显然是另一种方法(其他人同意)。所以鼓励其他答案,那么到底有什么论据呢?要清楚自己的问题,如果需要适当的关注,也许可以考虑打开自己的问题。Ps我不是SO mod,我无法删除评论
Stoff,

2

我认为@zkanda的解决方案稍作改动就可以了。如果您在各自的列表中有条件和值,则可以使用列表推导进行比较,这将使添加条件/值对的过程更加通用。

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 4]
if all([c==v for c, v in zip(conditions, values)]):
    # do something

如果我确实想对这样的语句进行硬编码,出于可读性考虑,我会这样写:

if (condition1==value1) and (condition2==value2) and \
   (condition3==value3) and (condition4==value4):

并与iand操作员一起提出另一个解决方案:

proceed = True
for c, v in zip(conditions, values):
    proceed &= c==v

if proceed:
    # do something

1
只是为了好玩:all(map(eq, have, expected))。(以及from operator import eq
加布里埃尔·加西亚

1

出于完整性考虑,仅提供了一些其他随机想法。如果它们对您有用,请使用它们。否则,您最好尝试其他方法。

您也可以使用字典来做到这一点:

>>> x = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> y = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> x == y
True

这个选项比较复杂,但是您可能还会发现它有用:

class Klass(object):
    def __init__(self, some_vars):
        #initialize conditions here
    def __nonzero__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
                self.cond3 == 'val3' and self.cond4 == 'val4')

foo = Klass()
if foo:
    print "foo is true!"
else:
    print "foo is false!"

邓诺(Dunno)是否适合您,但这是您可以考虑的另一种选择。这是另一种方式:

class Klass(object):
    def __init__(self):
        #initialize conditions here
    def __eq__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
               self.cond3 == 'val3' and self.cond4 == 'val4')

x = Klass(some_values)
y = Klass(some_other_values)
if x == y:
    print 'x == y'
else:
    print 'x!=y'

我还没有测试过最后两个,但是如果您想使用这些概念,那么它们的概念应该足以让您开始工作。

(从记录来看,如果这只是一次性的事情,那么使用最初介绍的方法可能会更好。如果在很多地方进行比较,这些方法可能会增强可读性,从而使您不会因为它们有点hacky而感到难过。)


1

我一直在努力寻找一种合适的方法来做到这一点,所以我只是想出了一个主意(不是灵丹妙药,因为这主要是一个品味问题)。

if bool(condition1 and
        condition2 and
        ...
        conditionN):
    foo()
    bar()

与我见过的其他解决方案相比,我发现此解决方案有一些优点,即,您恰好获得了额外的4个缩进空间(布尔),允许所有条件垂直排列,并且if语句的主体可以缩进一种清晰的方式 这也保留了对布尔运算符进行短路评估的好处,但是当然会增加基本上不执行任何操作的函数调用的开销。您可能会(有效地)争辩说,可以在此处使用任何返回其参数的函数而不是bool,但是就像我说的那样,这只是一个主意,最终是一个品味问题。

有趣的是,当我写这篇文章并思考“问题”时,我想到了另一个想法,它消除了函数调用的开销。为什么不通过使用额外的圆括号来表明我们将要输入复杂的条件?再说2个,相对于if语句的主体,给子条件一个2的空格缩进。例:

if (((foo and
      bar and
      frob and
      ninja_bear))):
    do_stuff()

我之所以喜欢这样,是因为当您看着它时,头上的铃铛立即响起,说:“嘿,这是一件复杂的事情!” 。是的,我知道括号并不能帮助提高可读性,但是这些条件应该很少出现,并且当它们出现时,您无论如何都要停下来仔细阅读它们(因为它们很复杂))。

无论如何,只有两个我在这里没有看到的建议。希望这可以帮助某人:)


1

您可以将其分为两行

total = cond1 == 'val' and cond2 == 'val2' and cond3 == 'val3' and cond4 == val4
if total:
    do_something()

甚至一次添加一个条件。这样,至少可以将混乱与混乱分开if


1

我知道这个线程很旧,但是我有一些Python 2.7代码,PyCharm(4.5)仍然抱怨这种情况:

if foo is not None:
    if (cond1 == 'val1' and cond2 == 'val2' and
        cond3 == 'val3' and cond4 == 'val4'):
            # some comment about do_something
            do_something

即使PEP8警告“带有与下一个逻辑行相同的缩进的可视缩进行”,实际代码也完全可以吗?这不是“缩进过度”吗?

...有时候我希望Python会咬住子弹,并且用花括号将其消失。我不知道这些年来由于偶然的错误压痕而意外引入了多少个错误...


0

将您的条件打包到一个列表中,然后再做。喜欢:

if False not in Conditions:
    do_something

0

我发现当我的条件很长时,我通常会有一个简短的代码主体。在这种情况下,我只是将身体缩进两次,因此:

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):
        do_something

1
@qarma,您愿意扩展吗?它肯定比使用行继续字符更好,PEP 8建议对行继续字符进行反对
xorsyst 2012年

实际上,这是行继续的有效情况。IMPO括号表示元组或函数调用。OP的用法非常像C,我尽可能使用python语法。我承认\虽然不受普遍青睐。
Dima Tisnek

0
  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

在这种情况下,缩进没有理由应为4的倍数,例如,请参见“与开孔定界符对齐”:

http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Indentation#Indentation


Google的指南还提供了一个复杂条件的示例,该条件与OP中提到的“最明显的方法”相匹配。尽管该指南没有明确主张以这种方式格式化长“ if”。
Anton Strogonoff'4

0

这是另一种方法:

cond_list = ['cond1 == "val1"','cond2=="val2"','cond3=="val3"','cond4=="val4"']
if all([eval(i) for i in cond_list]):
 do something

这也使您可以轻松地添加另一个条件,而无需更改if语句,只需将另一个条件附加到列表即可:

cond_list.append('cond5=="val5"')


0

如果我们的if&else条件必须在其中执行多个语句,则我们可以像下面这样编写。每当我们有if else例子时,里面都有一个语句。

谢谢它为我工作。

#!/usr/bin/python
import sys
numberOfArgument =len(sys.argv)
weblogic_username =''
weblogic_password = ''
weblogic_admin_server_host =''
weblogic_admin_server_port =''


if numberOfArgument == 5:
        weblogic_username = sys.argv[1]
        weblogic_password = sys.argv[2]
        weblogic_admin_server_host =sys.argv[3]
        weblogic_admin_server_port=sys.argv[4]
elif numberOfArgument <5:
        print " weblogic UserName, weblogic Password and weblogic host details are Mandatory like, defalutUser, passwordForDefaultUser, t3s://server.domainname:7001 ."
        weblogic_username = raw_input("Enter Weblogic user Name")
        weblogic_password = raw_input('Enter Weblogic user Password')
        weblogic_admin_server_host = raw_input('Enter Weblogic admin host ')
        weblogic_admin_server_port = raw_input('Enter Weblogic admin port')
#enfelif
#endIf

0

请原谅我,但是碰巧我对#Python的了解不如在座的任何人,但是碰巧我在3D BIM建模中编写自己的对象时发现了类似的东西,因此我将使算法适应python的

我在这里发现的问题是双面的:

  1. 对于可能会尝试解密脚本的人,我认为我似乎很陌生。
  2. 如果更改了这些值(最可能的话),或者必须添加新的条件(损坏的架构),则代码维护的成本将很高。

要绕过所有这些问题,您的脚本必须像这样

param_Val01 = Value 01   #give a meaningful name for param_Val(i) preferable an integer
param_Val02 = Value 02
param_Val03 = Value 03
param_Val04 = Value 04   # and ... etc

conditions = 0           # this is a value placeholder

########
Add script that if true will make:

conditions = conditions + param_Val01   #value of placeholder is updated
########

### repeat as needed


if conditions = param_Val01 + param_Val02 + param_Val03 + param_Val04:
    do something

这种方法的优点:

  1. 脚本可读。

  2. 脚本可以轻松维护。

  3. 条件是对表示所需条件的值之和进行的1比较操作。
  4. 无需多级条件

希望对大家有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.