gaogaotiantian / objprint

A library that can print Python objects in human readable format
Apache License 2.0
510 stars 43 forks source link

如何实现“增量”打印? #62

Closed Saltsmart closed 2 years ago

Saltsmart commented 2 years ago

您好!我正在使用objprint跟踪迭代过程,代码大致如下:

for i in range(i_max):
    obj.step()
    op(obj)

已知obj中有些变量在执行step后是不发生改变的,在第二次到最后一次调用op时,是否能够不打印这些变量?也就是只打印发生了变化的变量?

gaogaotiantian commented 2 years ago

跟踪变量是一个非常大而且非常困难的话题,它设计到了变量的保存、复制和比较,做一个generic的增量变化检查本身就是一个很大的项目,远超objprint的功能范围了。你可以看一下我另一个项目watchpoints里面的代码,还是很复杂的。

我们随便举个例子,这个变量本身可能保存了其他的object,它里面的attribute可能增加了减少了改变了,改变的话可能变化在第N层(比如obj.a.b.c.d变了),这种改变未必能通过==发现(自定义数据结构不一定定义了__eq__,即便定义也未必符合你的期待)。你会发现这个层级的问题,它就不是objprint应该尝试解决的问题了。

如果你觉得你这个跟踪的情况,由于你代码本身的制约,它是比较有规律的,你完全可以自己去追踪哪个attribute有了变化(自己试一下也没准可以感受到这个任务的复杂程度),然后返回一个attribute list,再用objprintincludeargument去打印

# 类似这样
changed_attributes = obj.get_changed_attributes()
op(obj, include=changed_attrubutes)

objprint的功能是“打印”,它的功能拓展是“打印什么”,“怎么打印”,而不是“追踪要打印的内容”。

Saltsmart commented 2 years ago

谢谢您! 今天看了您讲“如何提问”的方法(bilibili),感觉也很有教益!