我有一些python(v2.7)代码,它使用osx内置的PyObjC绑定,通过NSBundle bundleWithPath:从捆绑包中获取可执行文件的路径
#bundlePath is a string/path to a .app or .kext
mainBundle = Foundation.NSBundle.bundleWithPath_(bundlePath)
if mainBundle:
binaryPath = mainBundle.executablePath()
一位客户报告说这引发了一个异常,并通过电子邮件向我发送了回溯:
^{pr2}$不幸的是,我不能在我的盒子上复制这个。NSBundle bundleWithPath:始终返回None或有效的bundle对象,代码似乎可以按预期处理这些对象。在
>>> print Foundation.NSBundle.bundleWithPath_(None)
None
>>> print Foundation.NSBundle.bundleWithPath_("invalid/path")
None
>>> print Foundation.NSBundle.bundleWithPath_("/Applications/Calculator.app/")
NSBundle </Applications/Calculator.app> (not yet loaded)
当然,我可以用try/except包装这段代码,但我的问题是,为什么if语句不能阻止这个异常?在
更新1
根据建议,我确认:
1) 缩进正确
2) 客户正在使用正确的(最新)代码
…还在想办法解决这个问题!在
问题不是
bundleWithPath
调用返回了意外的结果。正如您所说,None
是它的有效返回值。在这表明客户端的机器有一个奇怪的python版本,其中
将实际打印
hello strange world
。在我自己从来没有见过这个,但这是您所看到的唯一解释,而且有一卡车不同的python解释器,所以其中一个有点奇怪并不令我震惊。在
检查一个变量是否是
^{pr2}$None
的一个普遍接受的做法是显式地进行,不管怎样,读起来要清晰得多,IMHO。在对于布尔表达式,将}的代码时。在
NoneType
强制为False
的整个实践会导致一些奇怪和不清楚的语义,尤其是当您拥有可以生成True
、False
或{我知道这不能回答问题的“为什么”部分,但我把它归结为一个奇怪的python版本。如果没有关于客户机计算机的详细信息,或者至少知道正在运行的python版本,很难说得更多。在
相关问题 更多 >
编程相关推荐