3

我正在尝试dict()使用 Pythons Rich 打印。据我了解,这应该在不同的行等上输出数据。有点像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',  ...

有什么建议么?

4

1 回答 1

4

TL;DR 如果您的字典结果不是dict,请进行显式转换。


从您的字典内容中,我假设您output来自 Cisco IOS 等网络设备配置,我对这些领域一无所知,无法完全弄清楚您从哪里获得数据。

您用来获取的模块或脚本有output可能实际上返回了一个dict名为MappingProxyType的外观类型。

我推测这就是为什么您的文字是彩色的但没有美化的原因。


例如,让我们看看rich.printwith 有什么作用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. 3rd 方库的开发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}

从中您可以看到 type 如何影响rich.print的输出。

要修复,只需转换types.MappingProxyTypedict.

>>> from rich import print
>>> print(dict(str.__dict__))

在此处输入图像描述

这比以前更漂亮了——不包括__doc__作为单个字符串且无能为力的值。

于 2021-05-10T12:50:46.703 回答