我正在尝试使用Pythons Rich打印dict()。据我所知,这应该会在不同的行上输出数据等。有点像pprint。
但是我得到了:
>>> from rich import print
>>> print(output)
{'GigabitEthernet0/1': {'description': '## Connected to leaf-2 ##', 'type': 'iGbE', 'oper_status': 'up',
'phys_address': '5000.0009.0001', 'port_speed': 'auto speed', 'mtu': 1500, 'enabled': True, 'bandwidth': 1000000,
'flow_control': {'receive': False, 'send': False}, 'mac_address': '5000.0009.0001', 'auto_negotiate': True,
'port_channel': {'port_channel_member': False}, 'duplex_mode': 'auto', 'delay': 10, 'accounting': {'other': {'pkts_in':
0, 'chars_in': 0, 'pkts_out': 431258, 'chars_out': 25875480}, 'ip': {'pkts_in': 513383, 'chars_in': 42910746,
'pkts_out': 471188, 'chars_out': 45342027}, 'dec mop': {'pkts_in': 0, 'chars_in': 0, 'pkts_out': 7163, 'chars_out':
551551}, 'arp': {'pkts_in': 3845, 'chars_in': 230700, 'pkts_out': 3846, 'chars_out': 230760}, 'cdp': {'pkts_in': 72010,
'chars_in': 18866620, 'pkts_out': 79879, 'chars_out': 31221768}}, 'ipv4': {'10.1.1.5/30': {'ip': '10.1.1.5', ...有什么建议吗?
发布于 2021-05-10 20:50:47
如果你的字典不是字典,就进行显式转换。
从你的字典内容看,我假设你的output来自网络设备配置,比如Cisco IOS,我对这些领域一无所知,也不太明白你是从哪里得到数据的。
您用来获取output的模块或脚本可能实际上返回了一个名为MappingProxyType的dict类型。
我推测这就是为什么你的文本是彩色的而不是美化的。
例如,让我们看看rich.print对str.__dict__做了什么
>>> from rich import print
>>> print(str.__dict__)这将看起来像这样,和你的一样。

请注意,这是在WSL2中运行的xfce4终端,被绘制到X410 X-server。一个功能齐全的终端。
这看起来确实像普通的dict,但让我们检查一下它的实际内容:
>>> type(str.__dict__)
<class 'mappingproxy'>
>>> from types import MappingProxyType
>>> isinstance(str.__dict__, MappingProxyType)
True
>>> isinstance(str.__dict__, dict)
False正如您所看到的,尽管它的输出看起来像一个字典,但它不是。
types.MappingProxyType本质上是一个只读字典,不一定是dict。像rich这样的第三方库的开发者可能已经忘记了这种类型的存在。如果是这样的话,rich.print会做内置print()会做的事情:调用__repr__/__str__ -现在只是把它当作字符串。
我们可以通过传递看起来像方法的__repr__的字符串来确认这一行为,并且仍然可以得到富文本处理。

也可以自己创建MappingProxyType的实例。
>>> from types import MappingProxyType
>>> from rich import print
>>> data = {f"{n}": n for n in range(11)}
>>> print(data)
{
'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9,
'10': 10
}
>>> print(MappingProxyType(data))
{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'10': 10}从中可以看到类型是如何影响rich.print的输出的。
要修复此问题,只需将types.MappingProxyType转换为dict。
>>> from rich import print
>>> print(dict(str.__dict__))

这比以前好多了-不包括__doc__值,它是一个单一的字符串,没有办法。
https://stackoverflow.com/questions/67426074
复制相似问题