gaogaotiantian / objprint

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

在面对继承自pydantic里BaseModel的实例时无法得到预期的输出 #52

Closed Sclock closed 2 years ago

Sclock commented 2 years ago

如题

from pydantic import BaseModel
from objprint import op

class pyt_class(BaseModel):
    x: int
    y: int

obj_test = pyt_class(x=0, y=1)

op(obj_test)
print(obj_test)

他打印:

x=0 y=1
x=0 y=1

希望后续更新能够支持! (B站码农高天的视频我是期期都看,期期都三连)

gaogaotiantian commented 2 years ago

这个是expected behavior。因为pydantic的BaseModel自己定义了__str__()函数(你也看得出来,否则print不会出现x=0 y=1这种值)。对于自己定义了__str__()函数的类型,objprint的默认行为是使用它定义好的__str__()函数,也就是和print()的效果一致。

如果不想用它定义的,可以加上honor_existing=False

op(obj_test, honor_existing=False)
<pyt_class 0x7fdd1d2a7ac0
  .x = 0,
  .y = 1
>

谢谢你在B站的支持~这个issue应该没有什么后续了,我就直接close啦。

Sclock commented 2 years ago

哈哈 我昨天研究了一下 发现了一个方便的方法。 直接写一个

# 继承BaseModel 并重载__str__方法
@add_objprint
class prt_BaseModel(BaseModel):
    pass

后续直接去继承自己写的prt_BaseModel也可以达到相同的效果,直接print就可以得到预期的输出。 不过不太清楚这么写会不会出现什么奇怪的问题。

gaogaotiantian commented 2 years ago

当你可以控制class的源代码的时候,完全可以这么写,这就是会overload掉这个class的str函数。好处确实是后面直接可以用print来完成。