如何让我的类在 Python 中易于打印?

2024-02-01

Python 有一个漂亮的打印机(pprint(...))。我想让我的课程易于打印。如果我提供特定的接口,漂亮的打印会以更好的方式打印我的实例吗?

Python 文档中的部分8.11 https://docs.python.org/3/library/pprint.html显示了不同的示例,但没有示例如何使用户定义的类易于打印。

那么我的类需要提供什么接口呢?
还有其他(也许更好)的格式化程序吗?


使用案例:

我想漂亮地打印内容配置解析器 https://docs.python.org/3.6/library/configparser.html,我为此创建了一个扩展版本,名为扩展配置解析器 https://github.com/Paebbels/ExtendedConfigParser?ts=2。所以我有可能添加更多功能或添加匹配的漂亮打印界面。


pprint不寻找任何钩子。这pprint.PrettyPrinter uses a 调度模式反而;类上的一系列关键方法class.__repr__参考。

你可以子类化pprint.PrettyPrinter教授你的班级:

class YourPrettyPrinter(pprint.PrettyPrinter):
    _dispatch = pprint.PrettyPrinter._dispatch.copy()

    def _pprint_yourtype(self, object, stream, indent, allowance, context, level):
        stream.write('YourType(')
        self._format(object.foo, stream, indent, allowance + 1,
                     context, level)
        self._format(object.bar, stream, indent, allowance + 1,
                     context, level)
        stream.write(')')

    _dispatch[YourType.__repr__] = _pprint_yourtype

然后直接使用该类来漂亮地打印包含的数据YourType实例。请注意,这取决于具有自己定制的类型__repr__ method!

您还可以将功能直接插入PrettyPrinter._dispatch字典;self是显式传入的。对于第三方库来说,这可能是更好的选择:

from pprint import PrettyPrinter

if isinstance(getattr(PrettyPrinter, '_dispatch'), dict):
     # assume the dispatch table method still works
     def pprint_ExtendedConfigParser(printer, object, stream, indent, allowance, context, level):
         # pretty print it!
     PrettyPrinter._dispactch[ExtendedConfigParser.__repr__] = pprint_ExtendedConfigParser

See the pprint模块源代码 https://github.com/python/cpython/blob/3.8/Lib/pprint.py了解如何编写其他调度方法。

与往常一样,单下划线名称如_dispatch是可以在未来版本中更改的内部实现细节。然而,这是您在这里的最佳选择。添加了调度表在Python 3.5中 https://github.com/python/cpython/commit/8e2aa88a40c0c7611a04696d1789da159e40d7f7并且至少存在于 Python 3.5 - 3.9 alpha 中。

您可能想看看rich https://rich.readthedocs.io/en/stable/introduction.html,一个第三方库,具有一些很棒的漂亮打印功能,并支持钩子(__rich_repr__);看到有关自定义漂亮打印的文档 https://rich.readthedocs.io/en/stable/pretty.html#rich-repr-protocol.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让我的类在 Python 中易于打印? 的相关文章

随机推荐

  • 如何在测试之间重置 Hardhat 的主网分叉?

    我正在使用 Hardhat 的主网分支在 Hardhat 中编写单元测试 但是一项测试的结果似乎会影响未来的测试并导致我的断言失败 我正在使用 Alchemy 和区块 14189520 进行分叉 例如 it Test 1 async fun
  • 为 libmysqlclient.18.dylib 库创建符号链接

    我已经通过 pkg 安装程序安装了 mysql 我正在尝试启动 Rails 服务器 但收到以下错误 Library not loaded libmysqlclient 18 dylib LoadError 我读到解决方案是创建一个符号链接
  • 将 RSSI 转换为距离

    如何将 RSSI 转换为距离 我有三个坐标 RFID 读取器 Reader1 0 0 读者2 0 8 读者3 8 5 应答器获取 RSSI 从阅读器 1 获取 156 从阅读器 2 获取 115 从阅读器 3 获取 124 我如何获得应答器
  • 将 C++ 结构填充为 2 的幂

    我正在为嵌入式系统编写一些 C 代码 代码使用的 I O 接口要求每个消息的大小 以字节为单位 是 2 的幂 现在 代码做了类似的事情 在几个地方 pragma pack 1 struct Message struct internal u
  • 为什么右大括号显示没有代码覆盖率?

    我有一个 Swift 函数 Xcode 在代码覆盖率中显示 0 次传递 该行是一个右大括号 下面以红色突出显示 这是 Xcode 中的错误吗 如果没有 我需要满足什么条件才能运行该线路 我以为我通过这种方法覆盖了所有路径 很确定这是 Xco
  • 如何使用 docker 桌面运行 docker-compose? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 10 上 有一个 docker compose 文件 并被告知使用 docker 桌面而不是终端来运行它 我不知道如
  • 对于NoUiSlider,如何设置手柄/拇指的宽度?

    我尝试设置 NoUiSlider 的宽度 通过CSS noUi horizontal noUi handle width 8px height 25px left 0px top 8px border 0px solid 000000 bo
  • 将矩阵拆分为 4 个子矩阵,其总和之间的差异最小

    我必须找到 4 个子矩阵之和之间的差异 这是分割矩阵后得到的A不管怎样 为了得到子矩阵之和之间的差值最小 例如 对于矩阵A 3 0 2 8 8 5 3 2 2 3 2 5 2 1 4 3 4 1 4 2 3 6 2 4 3 我可以这样分割它
  • 如何使用 dplyr::mutate_all 对选定列进行舍入

    我正在使用以下软件包版本 devtools install github hadley dplyr gt packageVersion dplyr 1 0 5 0 9001 带有以下小标题 library dplyr df lt struc
  • 如何禁用 django-allauth 创建新帐户,但仍允许现有用户登录? [复制]

    这个问题在这里已经有答案了 我们已经运行一个网站一段时间了 该网站使用django allauth https github com pennersr django allauth使用以下任一方式进行身份验证 传统的基于电子邮件的注册 谷歌
  • 如何正确处理整个 DataFrame 中与 NaT 值的日期时间比较?

    当我试图检查是否是一个奇怪的行为时 我偶然发现了这种奇怪的行为DataFrame具有高于特定日期的值 而该 DataFrame 还可能包含pd NaT 值比较的行为符合预期 import pandas as pd pd NaT gt pd
  • Flask - 下载后删除文件

    我的代码需要一些帮助 在我的网站上 我无法弄清楚如何解决问题 我通过 JavaScript 解释代码创建一个链接 让您下载静态文件夹所请求的文档 这样做 App route static document
  • Flutter:如何在 TextField 上使用 focusNode 属性

    我想控制TextField当 f 用户点击它时的小部件 我该如何实施focusNode财产 描述中没有详细的解释 FocusNode focusNode void initState focusNode new FocusNode list
  • 除了 EAR 和 EJB 之外,我还可以从 Java EE 应用程序服务器获得哪些在 Tomcat 等 servlet 容器中无法获得的内容?

    我们使用 Tomcat 来托管基于 WAR 的应用程序 我们是 servlet 容器兼容的 J2EE 应用程序 但 org apache catalina authenticator SingleSignOn 除外 我们被要求迁移到商业 J
  • 设置单元格的列跨度/行跨度

    我有一张桌子 我想换colspan rowspan运行时单元格的属性 这是一个例子 table border 1 tr td cell 1 td tr table
  • 拦截并覆盖来自 WebView 的 HTTP 请求

    我的应用程序中有一个 WebView 其中打开了某个网站 始终相同 这是我自己的页面 该站点有一些 JS 代码 可以从远程主机加载一些图像 我想拦截对此类图像的请求 通过 URL 模式 并返回我自己的内容 即另一个图像 或者根据内部应用程序
  • 如何在 VB6 和 C# 之间共享接口?

    我希望能够编写一个可以在 C 和 VB6 类中实现的类接口 以便可以在 VB6 代码中以相同的方式处理这些类 但我无法完成这项工作 在VB6中 我想使用Implements关键字来实现VB6Class类来实现一些接口ISharedInter
  • 在 Gingerbread 中实现拖放

    我需要知道如何在 Android 中为 Gingerbread 版本实现拖放 据我所知 Gingerbread 默认不支持这一点 我编码的内容 ViewGroup班级持有动态添加的孩子 每个孩子应该在长按后 能够通过手指点击 移动来移动 为
  • Excel单元格有一个看不见的字符

    我正在尝试VLOOKUP在两个不同的 Excel 工作表之间 但它总是返回 N A 我发现问题出在查找工作簿 第二个工作簿 上 单元格中的值是一串长度为 9 的字母 但是当我使用 len A1 式 它表明10人物 所以我用了TRIM 但它仍
  • 如何让我的类在 Python 中易于打印?

    Python 有一个漂亮的打印机 pprint 我想让我的课程易于打印 如果我提供特定的接口 漂亮的打印会以更好的方式打印我的实例吗 Python 文档中的部分8 11 https docs python org 3 library ppr