谁能给我解释一下“守护者模式”吗

问题描述 投票:0回答:5
尝试搜索监护人模式,但我找不到任何可以回答我的问题的内容,所以我又来了。在我正在读的书中,作者使用了一行他称之为“守护者模式”的代码,但我不太明白它是如何工作的。这是示例,如果有人可以向我解释它,我将不胜感激。

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

那么为什么,如果行的长度 > 0 并且 line[0] == '#' : 如果我什么都没有就按回车键,这不是错误吗?该行不是 0,因此该行不 > 0 吗?如果你把原始代码放在其中

if line[0] == '#' :

当你按下回车键时就会出错。

python python-2.7 short-circuiting
5个回答
2
投票
那么为什么,如果行的长度 > 0 且 line[0] == '#' :如果我只是按回车键,那里什么也没有,那不会出错吗?

不,它不会抛出错误。 Python 使用惰性求值,可以使用

and

 运算符进行短路。请参阅
文档

换句话说,只有当第一部分是

line[0] == '#'

 时,才会计算布尔表达式的第二部分,即 
True

我相信这就是作者将其称为

守护者模式的原因,以便表达式的第一部分避免(guards)表达式第二部分中可能出现的错误。

如果您删除第一部分(如您所显示的示例中所示),那么当

line

 中没有元素时,您将尝试访问 
line[0]
 (
line
) 的第一个元素。


0
投票
该行不是 0,因此该行不 > 0 吗?

如果您只按 Enter 键,则行是

""

 。一个空字符串。该字符串 
len(line)
 的长度为 0(因此,一旦计算 
and
 语句的第一个情况,程序就会继续执行。如果您访问空行的第一个索引 
0
,它将抛出错误。因此,在访问它之前始终检查您是否确实有第一个索引...


0
投票
我刚刚了解到,我是这么认为的,这是我为自己创建的定义:守护者模式是一种可能导致错误的代码,但它不会,为什么?因为 python 没有完成代码的执行,它只是运行了正确的部分,因为这就足够了。


0
投票
“守护者模式”是“在调用函数之前检查会导致错误的事情。”的一种奇特方式。

示例: 如果您请求数组的第 10 个元素,而该数组只有 5 个元素,则会出现索引错误。在请求 my_array[10] 之前,守护者模式会检查以确保数组至少有 11 个元素(想一想)。

def somefunction(content): if len(content) > 11: return content[10] else: return None
另一种方法是用 try/catch 块包围代码。如果您有多种可能导致问题的情况,并且您不关心其中哪一个是问题所在,那么这将为您省去一些挑剔的麻烦。

老实说,我必须查一下这个。当我学习编程时,我们只是将其称为“验证”。


-1
投票
if len(wds) < 3 or wds[0] != 'From' : continue
    
© www.soinside.com 2019 - 2024. All rights reserved.