首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rich打印Dict()

使用Rich打印Dict()
EN

Stack Overflow用户
提问于 2021-05-07 05:17:38
回答 1查看 382关注 0票数 3

我正在尝试使用Pythons Rich打印dict()。据我所知,这应该会在不同的行上输出数据等。有点像pprint

但是我得到了:

代码语言:javascript
复制
>>> 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',  ...

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-10 20:50:47

如果你的字典不是字典,就进行显式转换。

从你的字典内容看,我假设你的output来自网络设备配置,比如Cisco IOS,我对这些领域一无所知,也不太明白你是从哪里得到数据的。

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

我推测这就是为什么你的文本是彩色的而不是美化的。

例如,让我们看看rich.printstr.__dict__做了什么

代码语言:javascript
复制
>>> from rich import print
>>> print(str.__dict__)

这将看起来像这样,和你的一样。

请注意,这是在WSL2中运行的xfce4终端,被绘制到X410 X-server。一个功能齐全的终端。

这看起来确实像普通的dict,但让我们检查一下它的实际内容:

代码语言:javascript
复制
>>> 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的实例。

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> from rich import print
>>> print(dict(str.__dict__))

这比以前好多了-不包括__doc__值,它是一个单一的字符串,没有办法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67426074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档