Python 中 dict 的 keys 视图动态性排序时报错的规避写法
很多人第一次碰到 TypeError: ' 或者 RuntimeError: dictionary changed size during iteration,都是在给 dict.keys() 做排序、切片、索引的时候。表面上看 d.keys() 像一个列表,实际它是 视图对象(view object),不持有数据副本,而是实时反映原字典的结构。这个特性在遍
很多人第一次碰到 TypeError: ' 或者 RuntimeError: dictionary changed size during iteration,都是在给 dict.keys() 做排序、切片、索引的时候。表面上看 d.keys() 像一个列表,实际它是 视图对象(view object),不持有数据副本,而是实时反映原字典的结构。这个特性在遍
切片是 Go 里最容易被误用的数据结构之一。很多人知道「append 可能触发扩容」,但真正写业务代码时,仍然会踩进同一个坑:函数里对切片 append 之后,调用方的数据没变;或者两个切片共享底层数组,改一个另一个跟着变,排查半天才发现是别名(alias)问题。这篇文章不讲概念复述,而是给出可运行的判定手段:怎么用 unsafe 拿到底层数组指针来判断扩容
业务里给对象挂"额外信息"是很常见的需求:ORM 的实体要记住自己是脏的、事件总线要记录监听器归属、序列化器要给对象打标记、DI 容器要保存单例的构造状态。最直接的做法是在对象上开一个 public $meta 属性,或者用 spl_object_id($obj) 当 key 塞进一个静态数组。前者侵入业务模型,后者在长生命周期进程(如 Swoole / R
做前端状态管理或 SDK 封装时,经常要写一层代理对象:它包住一份内部数据,外部只能通过 get('userName') 这类方法读取字段。麻烦在于,字符串键名没有任何类型信息——拼错一个字母、改字段名忘了同步、访问一个不存在的属性,TypeScript 全都放行,等到运行时才返回 undefined,排查链路直接拉到最长。本文解决的就是这件事:利用 K e
在 Java 里用文本块(text block)内嵌 YAML 配置,几乎所有人都会遇到同一个坑:代码里看上去缩进整齐的片段,拼进字符串后行尾多出空白、或者被 stripIndent 削掉关键缩进,最终 SnakeYAML 抛出的异常是 mapping values are not allowed here。而换一种写法,同样是 YAML,却又能正常解析。问
用 dataclass 建模时,经常遇到这种字段:调用方要么传一个值,要么传一组「原材料」让你在构造阶段算出来,而且算出来的结果必须满足某些约束,不满足要立刻报错。比如 price 和 tax_rate 二者必须给其一,另一个由默认税率推导;再比如 birthday 与 age 只能二选一,给了生日就反推年龄,给了年龄就反推生日年份。这类需求用普通 fiel
在 ECMAScript 里用 Proxy 做数据校验、埋点拦截或响应式系统时,set trap 返回 false 是最容易被低估的一个细节:非严格模式下它静默失败,严格模式下它抛出 TypeError: 'set' on proxy: trap returned falsish。更麻烦的是,这道错误来自引擎内部([[Set]] 内部方法的断言),而不是来自
写 Java 的 IO 代码时,多数人已经习惯用 try-with-resources 替代手写 finally 里的 close()。但真正遇到线上问题时,一个高频疑问是:主逻辑抛了异常,close() 也抛了异常,为什么日志里只看得到主异常?第二个异常去哪了?答案是被挂到了主异常的 suppressed 列表里,需要通过 Throwable.getSup
把二维数组按某个字段重建成「键 = 字段值」的哈希表,是 PHP 业务代码里出现频率极高的操作。自 PHP 5.5 引入 array_column 之后,很多人会写成 array_column($rows, null, 'sku') 一行完成索引重建,然后配合 array_key_exists 判断某个键是否存在,或者用 isset 做快速命中检查。问题在于