我有一个函数,它可以返回以下三种情况之一:

成功(真正的) 失败(错误) 读取/解析流错误(无)

我的问题是,如果我不应该测试True或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数据类型?我不希望模拟函数抛出异常,因为我希望外部程序对错误所做的只是记录它并继续。


当前回答

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]

如果您计划修改模拟函数以包含更多返回代码,那么维护这些代码可能会成为一个问题。

模拟还可能在解析错误时引发异常,在这种情况下,您要么在这里捕获它,要么让它向上传播一级,打印位将减少为一行if-else语句。

其他回答

我想强调的是,即使在某些情况下,如果expr:是不够的,因为人们想确保expr是True,而不仅仅是不同于0/None/其他,出于同样的原因,S.Lott提到了避免== None。

它确实稍微更高效,而且,锦上添花的是,它更具有人类可读性。

In [1]: %timeit (1 == 1) == True
38.1 ns ± 0.116 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [2]: %timeit (1 == 1) is True
33.7 ns ± 0.141 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
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]

如果您计划修改模拟函数以包含更多返回代码,那么维护这些代码可能会成为一个问题。

模拟还可能在解析错误时引发异常,在这种情况下,您要么在这里捕获它,要么让它向上传播一级,打印位将减少为一行if-else语句。

永远,永远,永远不要说

if something == True:

从来没有。这很疯狂,因为你在重复if语句的冗余条件规则。

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

if something == False:

你没有。请随意使用。

最后,执行a == None是低效的。Do a为None。None是一个特殊的单例对象,只能有一个。检查一下你是否有这个对象。

我认为,对于您的情况,抛出异常是一个更好的主意。另一种选择是返回元组的模拟方法。第一项是状态,第二项是结果:

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

不要害怕异常!让你的程序只记录并继续,就像这样简单:

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

现在,您可以从模拟方法获得更丰富的通知类型,以确定究竟是什么出错了,以防您发现错误/无错误信息不够丰富。