Python __slots__ 继承:父类限制了字段,为什么子类还能随手增加属性 基础记录类用 __slots__ 固定了 name 字段,给对象多写一个 note 会报错。后来只是加了一个不含任何代码的子类,同样的 note 赋值却成功了。父类的槽位没有失效:子类仍然继承那些字段,同时因为没有声... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python total_ordering:比较方法补齐了,为什么异类对象仍应返回 NotImplemented 给优先级对象写了 __eq__ 和 __lt__,再加 total_ordering,就能使用小于等于和大于等于。随后有人把对象与普通整数比较,方法里的 other.value 报了错。装饰器只负责根据已有比较方法补... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python UserDict 与 dict 子类:重写了 __setitem__,为什么 update 仍绕过转换 想让配置键统一大写,最直接的做法是继承 dict 并重写 __setitem__。单条赋值测过没有问题,接上 update 批量导入后,小写键却重新出现。问题在于“某个方法完成写入”和“这个方法一定调用被重写的钩子”... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python getattr_static:只是检查属性,为什么 property 里的代码已经执行了 给对象生成字段说明时,程序只想确认 total 是否存在,于是先调用 hasattr,再调用 getattr 展示值。结果查询计数多了两次,原本只读的检查还触发了计算。属性访问并不总是从字典拿出一个值;propert... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python re.findall 捕获组:只加了一对括号,结果为什么从整段变成编号 脚本从文本里提取零件编号,原来返回 A-12、B-34。后来为了方便给字母部分加上分组,输出突然只剩 A、B;再加一组数字,结果又变成元组。匹配位置可能完全没变,改变的是 findall 根据捕获组数量决定的返回结构... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python strptime 省略年份:三月能解析,为什么二月二十九日突然报错 一个每年重复使用的展览目录只保存“月/日”。大多数值都能用 %m/%d 解析,只有 02/29 报出日期越界。输入未必有错:datetime.strptime 会为没有提供的部分使用默认值,其中年份是 1900,而这... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Python islice 的步长:只拿到两项,为什么原迭代器已经向前走了七步 从一条逐项生成的数据流里每隔三项取一次样本,islice 看起来像列表切片。结果列表只有两项,可是随后继续读取原流,却从第八项开始。被跳过的数据已经被读取并丢弃,源迭代器不会为另一个使用者保留这些位置。下面用 see... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
Python BytesIO 导出缓冲视图:内容能改,为什么追加和关闭却被拒绝 一个打包函数把 BytesIO 交给后续处理器,希望对方直接检查内容,省去一次中间复制。处理器调用 getbuffer 后保留了视图,打包函数接着追加尾标记,却收到 BufferError;退出时关闭流也失败。问题出... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite 标量子查询:查到两条配置,为什么没有报错却只返回一个值 应用通过一个嵌套查询读取主题颜色,配置表里误留了两条同名记录,页面却没有报错,只悄悄显示其中一个颜色。如果预期“一条配置只能对应一个值”,查询成功反而可能掩盖重复数据:SQLite 的标量子查询不会自动替你验证行数唯... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite substr 负长度:往前取两个字符,为什么结果没有倒过来 从固定后缀前取出四位编号,写出负长度以后,结果顺序却没有反转。有时甚至少取一个字符。这里容易把三个概念混在一起:起点从哪边数、选择起点哪一边,以及最终文本按什么顺序返回。负长度改变取值方向,不改变排列顺序SQLite... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读