4

在 Objective-C 中,你可以做[variable valueForKeyPath:@"abc.def"][[variable abc] def]如果 abc不存在,variablenil最终会得到一个值,并且不会得到错误或异常。这真的很方便。Python中有这样的东西吗?我知道你可以(至少对于字典)

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

或者

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

这似乎非常冗长。当我只想访问对象的属性或返回 None 值时,有没有更简单的方法?

4

4 回答 4

4

关于什么

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

好吧,这只适用于 dict..

于 2012-07-17T03:39:15.753 回答
3

您可以使用嵌套调用getattr

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

您也可以省去方法,而只需抓住AttributeError

try:
    def = variable.abc.def
except AttributeError:
    def = None
于 2012-07-17T03:49:20.130 回答
1

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

在 Objective C 的情况下(以及 PHP,这是出了名的不愉快的调试),程序可能会在你意识到你的变量设置不正确之前继续运行很长时间。一般来说,错误发生的时间越长,查找原因就越困难。这很不方便。

于 2012-07-17T04:00:26.893 回答
1

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

于 2012-07-17T03:36:33.200 回答