我有一些像这样的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模式启动时使我的代码更健壮失败了。
答案 0 :(得分:6)
当然,如果没有定义名称bob,那么bob是否等于false
没有。如果未定义bob
,则尝试使用它是一个错误。
将bob = None
放在文件的顶部,以确保在所有代码路径中定义它。
答案 1 :(得分:2)
当你这样做时:
bob = bob_module.Bob('alpha')
Python不会到达分配阶段(从失败的函数调用中分配返回) - 它将直接跳到异常捕获阶段。
由于bob仍未定义,因此当您稍后在语句中尝试使用它时:
if bob:
Python不知道bob
是什么,更不用说它会评估为True
或False
,因此会弹出另一个错误。
如果你想预先定义bob
而不管第一个函数的执行结果如何,只需在函数调用之前为它分配None
,以便Python知道bob
是{{}无论之前发生了什么,都可以在if语句中正确地评估它。
更新 - 如果您确实不想事先定义None
,您仍然可以通过以下方式检查其存在:
bob
或检查它是否存在并评估为if "bob" in globals(): # replace globals() with locals() for the current scope
:
True