You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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)

关键逻辑说明

  1. 获取类型标注:通过self.__annotations__可以拿到类中每个属性的类型定义,比如AUTO_COMMIT对应的类型是bool。
  2. 类型分支处理:
    • 布尔类型:把输入字符串转小写后判断是否等于"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:25:24