函数输入是一个复杂的字典:
[{'blacklist': [{'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z][[0-9]*]"'}, {'devnode': '"^cciss!c[0-9]d[0-9]*"'}]}, {'defaults': [{'user_friendly_names': 'yes'}]}, {'defaults': [{'udev_dir': '/dev'}, {'polling_interval': '10'}, {'selector': '"round-robin 0"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'prio_callout': 'none'}, {'path_checker': 'readsector0'}, {'rr_min_io': '100'}, {'max_fds': '8192'}, {'rr_weight': 'priorities'}, {'failback': 'immediate'}, {'no_path_retry': 'fail'}, {'user_friendly_names': 'yes'}]}, {'blacklist': [{'wwid': '26353900f02796769'}, {'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z]"'}]}, {'devices': [{'device': [{'vendor': '"COMPAQ "'}, {'product': '"HSV110 (C)COMPAQ"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'path_checker': 'readsector0'}, {'path_selector': '"round-robin 0"'}, {'hardware_handler': '"0"'}, {'failback': '15'}, {'rr_weight': 'priorities'}, {'no_path_retry': 'queue'}]}, {'device': [{'vendor': '"COMPAQ "'}, {'product': '"MSA1000 "'}, {'path_grouping_policy': 'multibus'}]}]}]
我想出了一个使它看起来像应该带有缩进的函数:
def pretty(d, indent=0):
for i in d:
for key, value in i.items():
print('\t' * indent + str(key) + ' {')
if isinstance(value, list):
for item in value:
if isinstance(item, dict):
for key_1, value_1 in item.items():
if isinstance(value_1, list):
print('\t' * (indent + 2) + str(key_1) + ' {')
for x in value_1:
for key_2, value_2 in x.items():
print('\t' * (indent + 3) + str(key_2) + 4 * ' ' + str(value_2))
print('\t' * (indent + 2) + '}')
else:
print('\t' * (indent + 1) + str(key_1) + 4 * ' ' + str(value_1))
print('}')
它的输出效果很好:
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z][[0-9]*]"
devnode "^cciss!c[0-9]d[0-9]*"
}
defaults {
user_friendly_names yes
}
defaults {
udev_dir /dev
polling_interval 10
selector "round-robin 0"
path_grouping_policy multibus
getuid_callout "/sbin/scsi_id -g -u -s /block/%n"
prio_callout none
path_checker readsector0
rr_min_io 100
max_fds 8192
rr_weight priorities
failback immediate
no_path_retry fail
user_friendly_names yes
}
blacklist {
wwid 26353900f02796769
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z]"
}
devices {
device {
vendor "COMPAQ "
product "HSV110 (C)COMPAQ"
path_grouping_policy multibus
getuid_callout "/sbin/scsi_id -g -u -s /block/%n"
path_checker readsector0
path_selector "round-robin 0"
hardware_handler "0"
failback 15
rr_weight priorities
no_path_retry queue
}
device {
vendor "COMPAQ "
product "MSA1000 "
path_grouping_policy multibus
}
}
但是我的功能只会深入“两层”,如果存在类似设备{device {item {}}}这样的东西,该如何使该功能更通用呢?
递归!
您需要编写函数以使其可以调用自身:
INDENT_STEP = 4
def print_indented(indent, *args, **kwargs):
"""
Prints anything with `indent` spaces before it.
Passes arguments to builtin print.
"""
print((" " * indent), *args, **kwargs)
def print_list(items, indent):
print("{")
for value in items:
print_formatted(value, indent)
print_indented(indent, "}")
def print_dict(dictionary, indent):
"""Prints each key and value of a dictionary, separated by a space."""
for key, value in dictionary.items():
child_indent = indent + INDENT_STEP
print_indented(child_indent, key, "", end="")
print_formatted(value, child_indent)
def print_formatted(item, indent=0):
if isinstance(item, list):
print_list(item, indent)
return
if isinstance(item, dict):
print_dict(item, indent)
return
print(item)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句