Python名称未定义,但评估为true。如何?

时间:2017-06-26 07:30:44

标签: python

我有一些像这样的python代码:

try:
    bob = bob_module.Bob('alpha')
except Exception as e:
    print 'Alpha mode failed for bob: '  + str(e) + ').'

try:
    if bob:
        bob.add('Beta')
    else:
        bob = bob_module.Bob('Beta')
except Exception as e:
    print 'Beta mode failed for bob: ' + str(e) + ').'

当此代码运行Alpha模式失败时,出于可理解的原因(与alpha服务器的交互失败)。但是测试模式失败的原因是“名称'bob'未定义”。

当然,如果未定义名称bob,那么if bob等于false,我们将进入else子句并运行Bob构造函数,将结果赋给变量{ {1}}?

我现在无法对此进行调试,因为导致Alpha模式失败的错误是暂时的,现在已经消失了,但我想了解这有两个原因:智力好奇,以及在alpha模式启动时使我的代码更健壮失败了。

2 个答案:

答案 0 :(得分:6)

  

当然,如果没有定义名称bob,那么bob是否等于false

没有。如果未定义bob,则尝试使用它是一个错误。

bob = None放在文件的顶部,以确保在所有代码路径中定义它。

答案 1 :(得分:2)

当你这样做时:

bob = bob_module.Bob('alpha')

Python不会到达分配阶段(从失败的函数调用中分配返回) - 它将直接跳到异常捕获阶段。

由于bob仍未定义,因此当您稍后在语句中尝试使用它时:

if bob:

Python不知道bob是什么,更不用说它会评估为TrueFalse,因此会弹出另一个错误。

如果你想预先定义bob而不管第一个函数的执行结果如何,只需在函数调用之前为它分配None,以便Python知道bob是{{}无论之前发生了什么,都可以在if语句中正确地评估它。

更新 - 如果您确实不想事先定义None,您仍然可以通过以下方式检查其存在:

bob

或检查它是否存在并评估为if "bob" in globals(): # replace globals() with locals() for the current scope

True