我经常使用嵌套dicts(例如从json.loads()
创建),有时更深层次的dicts会有所不同。 我想找到一种更优雅的Pythonic方式来访问子字节而不需要很多嵌套的if
语句。
data = some_func()
if 'network_data' in data:
print "\n## IP Info"
if 'hostname' in data['network_data']:
print "- Hostname: %s" % data['network_data']['hostname']
if 'org' in data['network_data']:
print "- Org: %s" % data['network_data']['org']
if 'city' in data['network_data'] and 'country' in data['network_data'] and 'region' in data['network_data']:
print "- Location: %s, %s, %s" % (data['network_data']['city'],
data['network_data']['country'],
data['network_data']['region'])
(为其他可能的子语言重复if
语句的各种版本,可能更深入。)
我知道关于dicts的.get()
函数,但后来我遇到了一些不存在某些中级dicts的问题:
ddos = []
for each in vcdb:
variety = each.get('action').get('hacking').get('variety')
if 'DoS' in variety:
ddos.append(each)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-21-40616b7d85d0> in <module>()
1 ddos = []
2 for each in vcdb:
----> 3 variety = each.get('action').get('hacking').get('variety')
4 if 'DoS' in variety:
5 ddos.append(each)
AttributeError: 'NoneType' object has no attribute 'get'
答案 0 :(得分:1)
dict.get
接受default
参数,你可以利用它,就像这样
variety = each.get('action', {}).get('hacking', {}).get('variety', {})
因此,即使在子字典中找不到后续键,它也会返回一个空字典而不是失败。