任何人都可以解释"监护人模式"对我来说

时间:2017-04-14 20:50:46

标签: python python-2.7 short-circuiting

试图寻找监护人模式,但我找不到任何能回答我问题的内容,所以我又来了。在我正在阅读的书中,作者使用了他称之为的一系列代码,"监护人模式"我真的不明白它是如何运作的。这是一个例子,如果有人能向我解释,我将不胜感激。

while True:
    line = raw_input('> ')
    if len(line) > 0 and line[0] == '#' :
        continue
    if line == 'done':
        break
    print line
print "done!"

为什么,如果线的长度> 0和行[0] =='#' : 如果我只是点击输入就没有错误。线条不是0,因此线条不是&n;> t> 0?如果您将原始代码放在

if line[0] == '#' : 

当你点击输入时它会出错。

4 个答案:

答案 0 :(得分:1)

  

为什么,如果线的长度> 0和line [0] =='#':如果我只是点击输入就没有错误。

不,它不会抛出错误。 Python使用延迟评估,可以使用and运算符进行短路。请参阅docs

换句话说,布尔表达式的第二部分,即line[0] == '#',只有在第一部分为True时才会被评估。

我相信这就是为什么作者称之为监护人模式的原因,因此表达式的第一部分避免了( guards )第二部分可能的错误表达的一部分。

如果删除第一部分,就像在您显示的示例中那样,那么当{{1}中没有元素时,您将尝试访问lineline[0])的第一个元素}}

答案 1 :(得分:0)

  

线条不是0,因此线条不是> 0?

如果您只按输入行""。一个空字符串。此字符串len(line)的长度为0(因此,一旦评估了and语句的第一个案例,就会使程序继续运行。如果访问空的第一个索引0它会抛出一个错误。因此,在访问它之前,一定要检查你是否真的有第一个索引......

答案 2 :(得分:0)

我刚刚了解到,我想这是我为自己创建的定义:监护人模式是可能导致错误的代码,但是没有,为什么?因为python没有完成执行代码,所以它只运行了正确的部分,因为这就足够了。

答案 3 :(得分:-1)

if len(wds) < 3 or wds[0] != 'From' :
       continue