如何解决Python字典转类属性时的类型转换失效问题?
解决Python类属性类型转换失效问题
你代码里的cast()函数只是给类型检查器(比如Mypy)用的类型提示工具,不会执行实际的类型转换,所以赋值后AUTO_COMMIT还是字符串类型,不会变成布尔值。要实现真正的类型转换,得先获取属性的标注类型,再根据类型处理字符串值。
修改后的代码
from typing import Dict class KafkaSettings(): BROKER_URL: str = None CLIENT_ID: str = None AUTO_COMMIT: bool = False def __init__(self, d: Dict[str, str]): if d is not None: # 获取类定义的属性类型标注 type_annotations = self.__annotations__ for key, value in d.items(): if key in type_annotations: target_type = type_annotations[key] # 根据目标类型转换字符串值 if target_type is bool: # 兼容大小写的布尔值转换,比如"False"/"false"都转为False casted_value = value.strip().lower() == "true" elif target_type is str: casted_value = value # 如需支持int/float等其他类型,可在此扩展分支 # elif target_type is int: # casted_value = int(value) else: casted_value = value self.__setattr__(key, casted_value)
关键逻辑说明
- 获取类型标注:通过
self.__annotations__可以拿到类中每个属性的类型定义,比如AUTO_COMMIT对应的类型是bool。 - 类型分支处理:
- 布尔类型:把输入字符串转小写后判断是否等于
"true",确保不同大小写的输入都能正确转换。 - 字符串类型:直接保留原输入值。
- 其他类型:可以按需添加转换逻辑(比如int类型用
int(value)转换)。
- 布尔类型:把输入字符串转小写后判断是否等于
测试验证
settings_dict = dict([('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]) settings = KafkaSettings(settings_dict) print(type(settings.AUTO_COMMIT)) # 输出 <class 'bool'> print(settings.AUTO_COMMIT) # 输出 False
内容的提问来源于stack exchange,提问作者araqiel
相关产品推荐
相关产品推荐

