试图寻找监护人模式,但我找不到任何能回答我问题的内容,所以我又来了。在我正在阅读的书中,作者使用了他称之为的一系列代码,"监护人模式"我真的不明白它是如何运作的。这是一个例子,如果有人能向我解释,我将不胜感激。
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] == '#' :
当你点击输入时它会出错。
答案 0 :(得分:1)
为什么,如果线的长度> 0和line [0] =='#':如果我只是点击输入就没有错误。
不,它不会抛出错误。 Python使用延迟评估,可以使用and
运算符进行短路。请参阅docs。
换句话说,布尔表达式的第二部分,即line[0] == '#'
,只有在第一部分为True
时才会被评估。
我相信这就是为什么作者称之为监护人模式的原因,因此表达式的第一部分避免了( guards )第二部分可能的错误表达的一部分。
如果删除第一部分,就像在您显示的示例中那样,那么当{{1}中没有元素时,您将尝试访问line
(line[0]
)的第一个元素}}
答案 1 :(得分:0)
线条不是0,因此线条不是> 0?
如果您只按输入行""
。一个空字符串。此字符串len(line)
的长度为0(因此,一旦评估了and
语句的第一个案例,就会使程序继续运行。如果访问空的第一个索引0
它会抛出一个错误。因此,在访问它之前,一定要检查你是否真的有第一个索引......
答案 2 :(得分:0)
我刚刚了解到,我想这是我为自己创建的定义:监护人模式是可能导致错误的代码,但是没有,为什么?因为python没有完成执行代码,所以它只运行了正确的部分,因为这就足够了。
答案 3 :(得分:-1)
if len(wds) < 3 or wds[0] != 'From' :
continue