当前位置: 首页 > news >正文

关于 Python 的踩坑记录

文章目录

    • 1. 写在最前面
    • 2. 踩坑说明
      • 2.1 TypeError: bad argument type for built-in operation
      • 2.2 论正确使用 proto
        • 2.2.1 protobuf
        • 2.2.2 protoc
    • 3. 碎碎念
    • 4. 参考资料

1. 写在最前面

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

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

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

2. 踩坑说明

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

2.1 TypeError: bad argument type for built-in operation

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

    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. 参考资料

  • 成功解决:TypeError: bad argument type for built-in operation
  • 一场Python内部的探险之旅
http://www.dtcms.com/a/291136.html

相关文章:

  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——0. 博客系列大纲
  • 多片RFSoC同步,64T 64R
  • (Python模块)Python 的进阶工具:sys模块、os模块 与 logging 模块
  • 通过TPLink路由器进行用户行为审计实战
  • tcpdump 命令解析(随手记)
  • Vue过度与动画效果
  • 【Linux】重生之从零开始学习运维之Mysql安装
  • GNU Radio多类信号多种参数数据集生成技巧
  • 【Spring AI】Advisors API—顾问(即拦截器)
  • 信号量demo
  • 【华为机试】503. 下一个更大元素 II
  • 【华为机试】85. 最大矩形
  • Excel函数 —— UNIQUE 去重提取唯一值
  • 智能码表新革命:VTX316-TTS语音芯片如何重塑骑行体验
  • 【补充】Linux内核链表机制
  • C语言自定义类型:联合体和枚举
  • CS231n-2017 Lecture4神经网络笔记
  • 【爬虫】05 - 爬虫攻防
  • 车载软件架构 --- 软件开发面临的问题
  • 神经网络——归一化层
  • 从 C# 到 Python:项目实战第五天的飞跃
  • Ubuntu 22 集群部署 Apache Doris 3.0.3 笔记
  • 音视频重回顾及nat内网穿透相关再整理笔记
  • Ubuntu 22.04 安装 Docker (安装包形式)
  • ESP32-S3 小电视学习笔记1:分光棱镜、QMI8658六轴惯导计、1.3英寸LCD屏
  • 4.Java创建对象有几种方式?
  • Spring Cloud——Spring Cloud LoadBalancer
  • 7月21日总结
  • C/C++---emplace和emplace_back
  • 企业IT管理——IT系统灾难恢复计划及实施步骤参考模板