最近接手了一个项目,用的是 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 转换为 True 货 False,但外部包裹了一层 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)
结语
- 这个 bug 不一定每人都能遇到,取决于你的环境变量配置和调用链路,但如果你和我一样这么配置,一定会有问题
- 最不起眼的工具函数,往往藏着最隐蔽的坑
我是罗工,10年Python开发经验。持续分享技术踩坑与实战经验。