关于 Python 的踩坑记录

1. 写在最前面

如果不熟悉某种开发语言,千万不要盲目自信的给出工期,否则你可能要为自己的乐观估计付出代价。

注:现在复盘开发中的问题,这种自己摸索的方式还是太低下了,还是应该更早的去请教同事们。

笔者付出的代价就是中午不吃饭 + 晚上加班排查。自己预估的工期,自己含泪也得完成不是......

2. 踩坑说明

笔者接到的需求是补充监控上报的指标,需要使用 proto 协议上报,在评估的时候,我是觉得这不应该很简单,生成 & 上报一下就可以。然而事实就是,被坑了两次。

2.1 TypeError: bad argument type for built-in operation

因为异常的时候只打印这个 「bad argument type for built-in operation」 报错,导致笔者分析了很长时间。但如果想打印出更多异常信息可以选择,增加打印,比如:

bash 复制代码
    print(e) # 打印错误信息
    print(type(e)) # 打印错误类型
    print(e.args) # 打印错误参数
    print(e.with_traceback()) # 打印错误堆栈

2.2 论正确使用 proto

2.2.1 protobuf

python 生成的 proto 对应的文件是会动态依赖 protobuf 库,且库的版本必须要跟 proto 的文件的版本对应。笔者使用的基础组件,在遇到这种依赖高版本的 protobuf 但本地又不存在的情况时,代码会直接崩溃。

注:苍天呐,它就崩溃在一个八百年都没有人动过的地方。时间紧任务重的压迫感瞬间袭来。

举例说明:

  • 生成的 protobuf 使用的 5.28.3
  • 本地的 protobuf 是 5.28.2
  • 然后,我连代码还没开发的时候,就在这个地方被这个崩溃卡主了......

2.2.2 protoc

上一个因为自己不懂的坑,终于被填完了,下一个又来。使用旧版本的 protoc 配合新版本的 protobuf 库可能会导致一些问题,具体取决于版本之间的变化。

产生这种不兼容的原因:

  • API 不兼容

    • 新特性缺失 : 新版本的 protobuf 库可能引入了新特性或方法,而旧版本的 protoc 生成的代码无法使用这些新特性。这可能导致运行时错误,特别是在尝试调用不存在的方法时。
    • 方法签名变化 : 如果新版本的 protobuf 库中对某些方法的签名进行了更改,旧版本的生成代码可能无法正确调用这些方法,导致运行时异常。

注:论服务 & 协议能够前向兼容的重要性

  • 序列化和反序列化问题

    • 数据结构变化 : 如果新版本的 protobuf 库对数据结构进行了更改(例如,添加、删除或重命名字段),旧版本的 protoc 生成的代码可能无法正确序列化或反序列化数据。这可能导致数据丢失或解析错误。
    • 默认值变化 : 在某些情况下,新版本的 protobuf 库可能会改变默认值的处理方式,这可能影响数据的序列化和反序列化。
  • 运行时错误

    • 运行时异常 : 如果旧版本的 protoc 生成的代码与新版本的 protobuf 库不兼容,可能会导致运行时错误,如 AttributeErrorTypeError
  • 兼容性问题

    • 跨版本兼容性 : 如果你在项目中使用了多个不同版本的 protobuf 库,可能会导致兼容性问题。特别是在大型项目中,多个库可能依赖于不同版本的 protobuf,这可能导致冲突。

3. 碎碎念

时隔多年,笔者又一次的进入了封闭开发的项目,真的是头大,不过好处是学东西的速度,简直飞快:

  • 天下钱粮皆有定数,不支于国库,不取于内帑,那么从何而来?只能从黄草驿、岭南荔园榨取,从沿途附户身上征派。取之于民,用之于上,又谈何不劳一文?
  • 不要为了适应世界而扭曲了自己。

4. 参考资料

相关推荐
brzhang2 小时前
颠覆你对代码的认知:当程序和数据只剩下一棵树,能读懂这篇文章的人估计全球也不到 100 个人
前端·后端·架构
躲在云朵里`2 小时前
SpringBoot的介绍和项目搭建
java·spring boot·后端
喵个咪2 小时前
Golang微服框架Kratos与它的小伙伴系列 - 分布式事务框架 - DTM
后端·微服务·go
brzhang3 小时前
我见过了太多做智能音箱做成智障音箱的例子了,今天我就来说说如何做意图识别
前端·后端·架构
晴空月明3 小时前
结构型模式-架构解耦与扩展实践
后端
WanderInk4 小时前
在递归中为什么用 `int[]` 而不是 `int`?——揭秘 Java 参数传递的秘密
java·后端·算法
why技术4 小时前
哎,我糊涂啊!这个需求居然没想到用时间轮来解决。
java·后端·面试
寻月隐君5 小时前
Rust 核心概念解析:引用、借用与内部可变性
后端·rust·github
万粉变现经纪人5 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题
后端·python·pycharm·django·numpy·pandas·pip
ai小鬼头5 小时前
创业心态崩了?熊哥教你用缺德哲学活得更爽
前端·后端·算法