在Python中,我应该如何testing一个variables是None,True还是False
我有一个函数可以返回三件事情之一:
- 成功(
True
) - 失败(
False
) - 错误读取/parsingstream(
None
)
我的问题是,如果我不应该testingTrue
或False
,我应该怎么看结果。 以下是我目前正在做的事情:
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 None
。 None
一个是特殊的单身物件,只能有一个。 只要检查一下,看看你是否有这个对象。
我相信抛出一个exception对于你的情况来说是一个更好的主意。 另一种方法是模拟方法返回一个元组。 第一项是地位,第二项是结果:
result = simulate(open("myfile")) if not result[0]: print "error parsing stream" else: ret= result[1]
我想强调的是,即使有些情况下, if expr :
是不够的,因为我们要确保expr
是True
,而不仅仅是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