正在处理一座屎山,大概情况是这样的。有一个自定义的class X
,需要改掉的东西注释写的是y=Union[X, str]
,实际情况也是两种类型到处都混在一起根本分不清。后面所有跟X
类有关的方法一点注释没写,甚至都不做类型判断,而是大量的使用getattr(y, 'name', y)
把水搅得更浑(如果y
是字符串,没有name
,返回字符串本身。否则返回y.name
也是一个字符串)。最离谱的是整座屎山还配了一套 30 分钟才能跑完的 pytest 。
现在需要把混乱的y
分成确定类型的y
和y_str
,使用 pydantic 强制定义数据类型来一点点排错。然而改了几百行以后,所有跟X
有关的方法都被迫改出两种版本的。pytest 不再报类型错误了,却开始出现各种离奇的 bug 挂掉。
有什么更强大的工具可以搞定这件事吗?比如同步检测两个版本的代码,看从哪一步开始两边的数据变得不一致了?
项目背景是一个生物博士毕设的Python代码商业化后形成的屎山。所以写成这样不意外,能跑起来才是意外。
![]() |
1
chaoshui 1 天前
交给 AI
|
![]() |
3
huangyezhufeng 1 天前
其实从开始用`Union`开始,就已经把潘多拉魔盒打开了一半。再用`getattr`,几乎是不可避免地成为屎山了。
为了避免误解,补充说明一下,用`Union`和`getattr`都没问题,前提是会用。从这个半个钟的单测来看,似乎并不是如此。 |
4
Syiize 18 小时 25 分钟前
可以重写 class X 中的魔术方法 __getattribute__,如果要访问的属性是 "name",就 raise RuntimeError 。然后运行代码,再根据 Python 的 traceback 定位到对应的位置修改。
|
5
xuegy OP @huangyezhufeng 字里行间甚至能看出来原作者对于 getattr 这个小聪明还挺自豪的
|