我有一个来自系统的特别讨厌的 stats 对象,我需要从中检索数据(为简洁起见,显示了许多统计条目中的两个)。
'https://localhost/mgmt/tm/sys/performance/all-stats/TMM%20Memory%20Used': {'nestedStats': {'entries': {'Average': {'description': '5'},
'Current': {'description': '5'},
'Max(since 2019_11_12T02:47:10Z)': {'description': '5'},
'Memory Used': {'description': 'TMM '
'Memory '
'Used'}}}},
'https://localhost/mgmt/tm/sys/performance/all-stats/Utilization': {'nestedStats': {'entries': {'Average': {'description': '9'},
'Current': {'description': '10'},
'Max(since 2019_11_12T02:47:10Z)': {'description': '53'},
'System CPU Usage': {'description': 'Utilization'}}}}}
目前我在嵌套堆栈中多次使用 .get 方法,但本周末我在 Talk Python 上听了glom 模块的作者并认为这对我来说可能是一个更清洁的解决方案。确实如此,因为这段代码使我将所有数据都放在一个循环中,而没有疯狂的 get 方法层(上图的第一个示例,我今晚正在研究)。外键是长 URL,内键是 avg/current/max/desc。
stats = b.tm.sys.performances.all_stats.load()
for k, v in stats.entries.items():
print('\n')
spec = f'entries.{k}.nestedStats.entries'
v_stats = glom(stats, spec)
for k, v, in v_stats.items():
spec = f'{k}.description'
stat_vals = glom(v_stats, spec)
print(f'{k}: {stat_vals}')
结果是我需要的数据:
Average: 5
Current: 5
Max(since 2019_11_12T02:47:10Z): 5
Memory Used: TMM Memory Used
也就是说,此时我并不能真正控制数据,我只是在打印它。我认为我还没有了解glom的力量,并且很好奇是否有人可以指出一个有助于我理解的例子?最终目标是将所有这些数据扁平化为包含 4 项字典的单个列表。