在Objective-C中,您可以执行[variable valueForKeyPath:@"abc.def"]
或[[variable abc] def]
,如果abc
上variable
不存在,您将获得nil
值结束,不会得到错误或异常。这真的很方便。 Python中有这样的东西吗?我知道你可以做(至少是字典)
abc = variable.get('abc', None)
if abc:
def = abc.get('def', None)
或
try:
def = variable.get('abc').get('def')
except:
pass
看起来非常冗长。当我只想访问对象的属性或获取无值时,是否有更简单的方法?
答案 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,这是众所周知的调试不愉快),程序可能会持续很长时间才能意识到您的变量设置不正确。通常,自错误发生以来的时间越长,找到原因就越困难。这很不方便。