在Python中,我应该如何testing一个variables是None,True还是False

我有一个函数可以返回三件事情之一:

  • 成功( True
  • 失败( False
  • 错误读取/parsingstream( None

我的问题是,如果我不应该testingTrueFalse ,我应该怎么看结果。 以下是我目前正在做的事情:

 result = simulate(open("myfile")) if result == None: print "error parsing stream" elif result == True: # shouldn't do this print "result pass" else: print "result fail" 

是真的很简单,删除== True部分,或者我应该添加一个tri-bool数据types。 我不希望simulate函数抛出一个exception,因为所有我想外部程序做一个错误logging并继续。

不要害怕exception! 让您的程序只需login并继续即可:

 try: result = simulate(open("myfile")) except SimulationException as sim_exc: print "error parsing stream", sim_exc else: if result: print "result pass" else: print "result fail" # execution continues from here, regardless of exception or not 

现在,您可以从模拟方法中得到更丰富的通知types,以确定发生了错误/不错误的情况。

 if result is None: print "error parsing stream" elif result: print "result pass" else: print "result fail" 

保持简单和明确。 你当然可以预先定义一个字典。

 messages = {None: 'error', True: 'pass', False: 'fail'} print messages[result] 

如果你打算修改你的simulate函数来包含更多的返回代码,保持这个代码可能会成为一个问题。

simulate也可能会引发parsing错误的exception,在这种情况下,您可能会在此处捕捉它,或者让它传播一个级别,并将打印位减less为单行if-else语句。

永远不要,永远不要说

 if something == True: 

决不。 这太疯狂了,因为你冗余地重复冗余条件规则为if语句。

更糟的是,从来没有,永远也不会说

 if something == False: 

not 。 随意使用它。

最后,做a == None效率。 做a is NoneNone一个是特殊的单身物件,只能有一个。 只要检查一下,看看你是否有这个对象。

我相信抛出一个exception对于你的情况来说是一个更好的主意。 另一种方法是模拟方法返回一个元组。 第一项是地位,第二项是结果:

 result = simulate(open("myfile")) if not result[0]: print "error parsing stream" else: ret= result[1] 

我想强调的是,即使有些情况下, if expr :是不够的,因为我们要确保exprTrue ,而不仅仅是0 / None /不同, is== 同样的原因S.洛特提到避免== None

它确实稍微有效一些,蛋糕上的樱桃更可读。

input:

 from time import time t0 = time() print ( ( 1 == 1 ) == True ) t1 = time() print ( ( 1 == 1 ) is True ) t2 = time() print '{:e}s\n{:e}s'.format( t1-t0, t2-t1) 

输出:

 True True 1.201630e-04s 8.797646e-05s