pprint.PrettyPrinter该pprint模块的文档提到该方法PrettyPrinter.format旨在使自定义格式化成为可能.
我认为可以在子类中重写此方法,但这似乎没有提供让基类方法应用换行和缩进的方法.
我已经检查了pretty模块,看起来很有趣,但似乎没有提供一种方法来自定义其他模块的类格式而无需修改这些模块.
我认为我正在寻找的东西可以让我提供类型(或可能是函数)的映射,这些类型可以识别处理节点的例程的类型.处理节点的例程将获取一个节点并返回它的字符串表示以及子节点列表.等等.
我的目标是紧凑地打印DocBook格式的自定义格式部分xml.etree.ElementTree.
(我很惊讶没有找到更多Python支持DocBook.也许我错过了那些东西.)
我在一个名为xmlearn的客户端中构建了一些使用lxml的基本功能.例如,要转储Docbook文件,您可以:
xmlearn -i docbook_file.xml dump -f docbook -r book
Run Code Online (Sandbox Code Playgroud)
这是相当半屁股,但它让我得到了我正在寻找的信息.
xmlearn还具有其他功能,例如构建图形图像的能力以及显示XML文档中标记之间关系的转储.这些与这个问题完全无关.
您还可以执行转储到任意深度,或将XPath指定为一组起始点.XPath的东西有点过时了特定于docbook的格式,所以它并没有真正发展完善.
这仍然不是这个问题的答案.我仍然希望那里有一个可以随意定制的漂亮打印机.
是否有一些内省方法允许可靠地获取对象实例的底层数据结构,不受任何自定义的影响?
在 Python 3 中,对象的低级实现可以被深深地掩盖:属性查找可以自定义,甚至__dict__和__slots__属性也可能无法提供完整的图片,因为它们是可写的。dir()明确表示要显示“有趣”的属性而不是实际属性,甚至该inspect模块似乎也不提供此类功能。
不是重复的。此问题已标记为重复是否有内置函数可以打印对象的所有当前属性和值?. 然而,另一个问题只讨论了自省类的标准方法,这里明确列出了在较低级别上不可靠的方法。
作为示例,请考虑以下带有故意模糊类的脚本。
import inspect
actual_members = None # <- For showing the actual contents later.
class ObscuredClass:
def __init__(self):
global actual_members
actual_members = dict()
self.__dict__ = actual_members
self.actual_field = "actual_value"
def __getattribute__(self, name):
if name == "__dict__":
return { "fake_field": "fake value - shown in __dict__" }
else:
return "fake_value - shown in inspect.getmembers()"
obj = ObscuredClass()
print(f"{actual_members = }")
print(f"{dir(obj) = …Run Code Online (Sandbox Code Playgroud)