在python中,如何测试变量是否为none、true或false

In Python how should I test if a variable is None, True or False

我有一个函数可以返回以下三项之一:

  • 成功(True)
  • 故障(False)
  • 读取/分析流时出错(None)

我的问题是,如果我不想对TrueFalse进行测试,我该如何查看结果。以下是我目前的做法:

1
2
3
4
5
6
7
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数据类型。我不希望simulate函数抛出异常,因为我只希望外部程序处理一个错误,那就是记录并继续。


1
2
3
4
5
6
if result is None:
    print"error parsing stream"
elif result:
    print"result pass"
else:
    print"result fail"

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

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

如果计划修改simulate函数以包含更多返回代码,那么维护此代码可能会有点问题。

simulate还可能引发解析错误的异常,在这种情况下,您要么在这里捕获它,要么让它向上传播一个级别,如果else语句,打印位将减少到一行。


别害怕例外!让您的程序只需登录并继续,就可以轻松做到:

1
2
3
4
5
6
7
8
9
10
11
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

现在,您可以从Simulate方法得到更丰富的通知,了解到底出了什么问题,以防您发现错误/无错误信息不够丰富。


从不,从不,从不说

1
if something == True:

从未。这太疯狂了,因为您要重复冗余地为if语句指定为冗余条件规则的内容。

更糟的是,永远,永远,永远,永远不要说

1
if something == False:

你有not。请随意使用。

最后,执行a == None是无效的。做a is NoneNone是一个特殊的单例对象,只能有一个。检查一下你是否有那个物体。


我想强调的是,即使在某些情况下,由于要确保exprTrue而不是仅仅与0None不同,所以is也会因为同样的原因而优先于==。lott提到避免== None的原因。

它确实稍微更有效率,而且,蛋糕上的樱桃色,更具人类可读性。

输入:

1
2
3
4
5
6
7
8
from time import time
t0 = time()
print ( ( 1 == 1 ) == True )
t1 = time()
print ( ( 1 == 1 ) is True )
t2 = time()
print '{:e}s
{:e}s'
.format( t1-t0, t2-t1)

输出:

1
2
3
4
True
True
1.201630e-04s
8.797646e-05s


我认为对你的情况来说,提出例外是个更好的主意。另一种方法是返回元组的模拟方法。第一项是状态,第二项是结果:

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