如何像kotlin一样以简单而富有表现力的方式访问嵌套严重且不可靠的json值



我正在尝试获得这个嵌套非常深的属性。

问题是,途中的一些值往往是None

以下是我怎么做的(错误的方式(。

def name(x):
x = x["relay_rendering_strategy"]
if x:
x = x["view_model"]
if x:
x = x["profile"]
if x:
x = x["event_place"]
if x:
x = x["contextual_name"]
if x:
return x.lower()
return ''
data = [x for x in get_events() if name(x) == 'ved siden af']

在kotlin中有一个很好的语法:

val name = first?.second?.third?.andSoFourth ?: ''

在python中有类似的很棒的方法吗???

您可以对dict.get和默认值执行类似的操作:

def name(x):
return x.get("relay_rendering_strategy", {}).get("view_model", {}).get("profile", {}).get("event_place", {}).get("contextual_name", "").lower()

或者使用一个简单的尝试,除了:

def name(x):
try:
return x["relay_rendering_strategy"]["view_model"]["profile"]["event_place"]["contextual_name"].lower()
except KeyError:
return ""

或者简单地通过一个循环来降低嵌套级别,使其更加干燥:

def name(x):
for k in ("relay_rendering_strategy","view_model","profile","event_place","contextual_name"):
if k not in x:
return ""
x = x[k]
return x.lower()

在python中,请求原谅比请求许可要好。

使用try/except(如@Iain Shelvington所建议的(。

def name(x):
try:
return x["relay_rendering_strategy"]["view_model"]["profile"]["event_place"]["contextual_name"].lower()
except (KeyError, AttributeError):
return ""

最新更新