label-studio 踩坑:一个环境变量引发的 bool 转换错误

最近接手了一个项目,用的是 label-studio 做数据标注。

具体情况就是,项目适配人大金仓的数据库,在一个新的环境中部署,就发现配置的环境变量,就是不生效

然后就开始往上追,就发现是在配置的时候,设置的是字符串数字

具体原因

代码里有个 cast_bool_from_str 函数,逻辑是:

python 复制代码
def cast_bool_from_str(value):
    if isinstance(value, str):
        if value.lower() in ['true', 'yes', 'on', '1']:
            value = True
        elif value.lower() in ['false', 'no', 'not', 'off', '0']:
            value = False
        else:
            raise ValueError(f'Incorrect bool value "{value}". ' f'It should be one of [1, 0, true, false, yes, no]')
    return value

其实坏就坏在下面这个函数:bool_from_request 传递的是数字字符串,会进入到 cast_bool_from_str 转换为 TrueFalse,但外部包裹了一层 int() 做转换,实际情况一跑,就报错了

python 复制代码
def bool_from_request(params, key, default):
    """Get boolean value from request GET, POST, etc

    :param params: dict POST, GET, etc
    :param key: key to find
    :param default: default value
    :return: boolean
    """
    value = params.get(key, default)

    try:
        if isinstance(value, str):
            value = cast_bool_from_str(value)
      
        return bool(int(value)) 

正确的写法

调整 return 判断是数值类型,在转换就可以了

python 复制代码
def bool_from_request(params, key, default):
    """Get boolean value from request GET, POST, etc

    :param params: dict POST, GET, etc
    :param key: key to find
    :param default: default value
    :return: boolean
    """
    value = params.get(key, default)

    try:
        if isinstance(value, str):
            value = cast_bool_from_str(value)
        
        if isinstance(value, int):
            return bool(int(value)) 
        else:
            return bool(value)

结语

  1. 这个 bug 不一定每人都能遇到,取决于你的环境变量配置和调用链路,但如果你和我一样这么配置,一定会有问题
  2. 最不起眼的工具函数,往往藏着最隐蔽的坑

我是罗工,10年Python开发经验。持续分享技术踩坑与实战经验。

相关推荐
2601_9537208216 分钟前
【计算机毕业设计】基于Vue与Spring Boot的高校兼职信息服务平台设计与实现
spring boot·后端·课程设计
再吃一根胡萝卜2 小时前
用 Rust 写一个桌面悬浮图标:为什么它比 Python 更适合 AI 桌面工具?
后端
IT_陈寒2 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端
evans在进步3 小时前
Spring Boot 核心机制详解:可执行 JAR、CORS、静态资源与配置绑定
spring boot·后端·jar
Sayuanni%33 小时前
SpringBoot 从注解到源码:核心知识点总结
java·spring boot·后端
陈随易4 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
人间凡尔赛5 小时前
2026 后端架构三驾马车:Wasm 容器上 K8s、存算分离与 AI 原生
后端·云原生·架构
凤山老林5 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
东风破_5 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript
凤山老林6 小时前
数据库读写分离与动态路由实战:Spring Boot + ShardingSphere-JDBC 生产配置
数据库·spring boot·后端·分库分表·sharding-jdbc