在 Python 中,如何打印自定义数据结构对象,例如。熊猫有吗?

In Python, how to print a custom data structure object, in a way that eg. Pandas does?

提问人:DMSBrian 提问时间:3/21/2023 最后编辑:DMSBrian 更新时间:3/21/2023 访问量:170

问:

我正在为自定义数据结构创建一个类,我希望它模仿 pandas 数据帧对象的行为。我想以 Pandas 的方式可视化我的对象 - 只需打印对象本身。当您创建一个 pandas 数据帧对象时,可以很容易地使用漂亮的格式打印它:

>>> import pandas as pd
>>> df = pd.DataFrame([1,2,3],[1,2,3])
>>> print(df)

   0
1  1
2  2
3  3

我假设这隐式访问了某些属性或调用了某些方法,该方法以某种方式打印所述属性。我知道存在一个方法,它可以在调用时返回一个字符串,但是 pd。DataFrame 似乎没有实现此方法,或者至少我无法在源代码中找到它 - 那么它是如何做到的呢?__str__

如果我使用 ,我当然可以将数据结构的行连接为字符串,变成一个带有新行的长字符串并返回它。我还可以返回一个空字符串(因为不能返回 None),并在 .__str____str____str__

这两种解决方案都有效,但它们似乎都有点奇怪/违反直觉。也许有更好的方法可以做到这一点,类似于 Pandas 等图书馆的处理方式?在这方面是否有已知的标准或最佳实践?

编辑:

可能相关的问题 - 当调用时,相同的过程如何在 Jupyter Notebooks 中发生?由于它不是简单地打印它,而是以一种格式良好的方式显示它 - 我将如何为我的对象定义这种行为?df

Python Pandas 字符串 对象 方法

评论

0赞 azro 3/21/2023
构建一个字符串并返回它是完美的方法,那么有什么问题呢?
1赞 0x5453 3/21/2023
pd.DataFrame定义__repr__,而不是 .__str__
0赞 DMSBrian 3/21/2023
@azro 本身没有问题,我只是注意到这不是熊猫处理它的方式,我想知道这里是否有既定的最佳实践,因为我以前从未处理过这种事情。
0赞 DMSBrian 3/21/2023
@0x5453,是的,它确实如此,但我认为仅在对对象调用 repr() 函数时才使用?也许我错了__repr__
2赞 chepner 3/21/2023
__repr__也是 If No other is defined 使用的回退。我怀疑其基本原理是数据帧主要用于查询,而不是显示,因此用于为调试提供可视化表示。object.__str____str__Dataframe__repr__

答:

1赞 DMSBrian 3/21/2023 #1

根据 @chepner、@0x5453 和 @azro 的评论汇编的答案:

生成字符串并返回它是执行此操作的预期方法。

方式 pd.DataFrame 通过定义方法来处理它。这是可能的,因为如果未明确定义,则用作 的回退。__repr____repr____str____str__

对编辑的回答:

当涉及到 IPython/Jupyter 笔记本中的可视化时,使用了不同的方法 - 。_repr_html_

评论

0赞 DMSBrian 3/21/2023
如果你们中的任何一个人想发布答案,我会接受的。否则我会在 2 天内接受这个。也许这是常识,但不知何故,我以前没有遇到过这种情况,所以我想它可能会对某人有所帮助。
1赞 0x5453 3/21/2023
Смотритетакже: __str__ 和 __repr__ 有什么区别? 以及 __repr____str__ 的官方文档
1赞 Wayne 3/22/2023
我将使用与基于 IPython/Python 的 Jupyter 集成的文档来标记这一点:IPython 中对象的表示此处是带有代码的自定义示例大纲。