“if”语句,不保护AttributeError:“NoneType”对象没有attribu

2024-06-01 20:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些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) 客户正在使用正确的(最新)代码

…还在想办法解决这个问题!在


Tags: path对象代码noneapp客户ifcalculator
1条回答
网友
1楼 · 发布于 2024-06-01 20:26:58

问题不是bundleWithPath调用返回了意外的结果。正如您所说,None是它的有效返回值。在

这表明客户端的机器有一个奇怪的python版本,其中

if None:
    print('hello, strange world')
else:
    print('hello, world')

将实际打印hello strange world。在

我自己从来没有见过这个,但这是您所看到的唯一解释,而且有一卡车不同的python解释器,所以其中一个有点奇怪并不令我震惊。在

检查一个变量是否是None的一个普遍接受的做法是显式地进行,不管怎样,读起来要清晰得多,IMHO。在

^{pr2}$

对于布尔表达式,将NoneType强制为False的整个实践会导致一些奇怪和不清楚的语义,尤其是当您拥有可以生成TrueFalse或{}的代码时。在


我知道这不能回答问题的“为什么”部分,但我把它归结为一个奇怪的python版本。如果没有关于客户机计算机的详细信息,或者至少知道正在运行的python版本,很难说得更多。在

相关问题 更多 >