无需try / catch即可安全地访问Python中的对象

时间:2012-07-17 03:26:58

标签: python idioms accessor

在Objective-C中,您可以执行[variable valueForKeyPath:@"abc.def"][[variable abc] def],如果abcvariable不存在,您将获得nil值结束,不会得到错误或异常。这真的很方便。 Python中有这样的东西吗?我知道你可以做(​​至少是字典)

abc = variable.get('abc', None)
if abc:
    def = abc.get('def', None)

try:
    def = variable.get('abc').get('def')
except:
    pass

看起来非常冗长。当我只想访问对象的属性或获取无值时,是否有更简单的方法?

4 个答案:

答案 0 :(得分:5)

怎么样

def = variable.get('abc', {}).get('def',None)

嗯,这只适用于dict ..

答案 1 :(得分:2)

您可以使用getattr的嵌套调用:

def = getattr( getattr(variable, 'abc', None), 'def', None)

您也可以省去这些方法,然后抓住AttributeError

try:
    def = variable.abc.def
except AttributeError:
    def = None

答案 2 :(得分:1)

您想要的内容没有简短的内置语法。您可能希望编写一个辅助函数来为您执行此操作,或collections.defaultdict可能有用。

答案 3 :(得分:1)

Python通过设计避免了这种行为,因为它可能导致难以诊断的错误。通过引发异常,程序员被迫使用dict.get(),getattr()等显式请求默认值,或以其他方式处理查找失败的情况。程序准确停止程序中发生错误的位置。

对于Objective C(以及PHP,这是众所周知的调试不愉快),程序可能会持续很长时间才能意识到您的变量设置不正确。通常,自错误发生以来的时间越长,找到原因就越困难。这很不方便。