python3 -c "import yaml;print(type(yaml.safe_load('timeout: 1e6')['timeout']))"
python3 -c "import yaml;print(yaml.safe_load('timeout: 1.0e6')['timeout'])"
YAML 里超时写成 timeout: 1e6,读出来是字符串 '1e6',乘以 1000 时抛 TypeError: can only concatenate str。改成 1000000 就正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:YAML 1.1 的浮点规则要求写成带小数点的形式,1e6 不在规范里,解析器按普通字符串处理。同样的值放进 JSON 是合法数字,两份配置读出来类型不同。
围绕「科学计数法解析」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:配置值统一写成整数或带小数点的浮点 别用裸的指数形式;读取后加一次类型校验 不是数字就直接报错退出;毫秒换算收在一处 别在业务代码里到处乘 1000;用 schema 校验配置文件 发版前跑一遍。
确认没问题再收工,改完读出来是 float 换算后的超时是 1000 秒 不再抛类型错误。
