我正在尝试将一个带有键值对的Dict [str,str]解析为一个对象(类)。第一个包含属性的名称,第二个包含值。
例如:[('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]
要解析的代码如下所示:
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:
for key, value in d.items():
attr = self.__getattribute__(key)
casted_value = cast(attr, value)
self.__setattr__(key, casted_value)
解析器可以工作,但是值的类型被改变了。例如,AUTO_COMMITattr的类型是 bool,但是setattr
的类型变成了 str。将值强制转换成正确的类型是不起作用的。我不懂Python语言。
如何解决这个问题?
谢谢
3条答案
按热度按时间ycggw6v21#
这是标准的pydantic电梯间推介。
输出:
顺便说一句,pydantic支持多种类型,并且顺序不同
"3"
=〉foo : str|int
=〉"3"
,而"3"
=〉foo : int|str
=〉3
,IIRC。并且
('AUTO_COMMIT', '1')
=〉True
。下面是一个更便于故障排除的工厂版本:
wa7juj8i2#
您可以使用下面的代码解决这个问题,
您可以通过检查
key
来解决此问题,如果它等于AUTO_COMMIT
,则可以使用bool()
方法将string
值强制转换为bool
值。但请注意,这是针对您的代码的特定解决方案。因此,在生成
dictionary
时,最好将这些值与其实际的type
(根据需要)相加。这样就不需要任何强制转换。举个例子,在这种情况下,你可以用这个,
[('CLIENT_ID','123456'), ('AUTO_COMMIT', False), ('BROKER_URL', 'http://foo.bar')]
(将
False
存储为布尔值而不是字符串)代替这一点,
[('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]
ekqde3dh3#
不能使用类型提示将值自动转换为另一种类型。需要显式。例如(并修复从变量注解提取类型信息的尝试):
您真正需要的是更明确的东西,将
__init__
划分为更简单的__init__
和类方法(更简单的__init__
可以由dataclasses.dataclass
自动生成)。使用字典是为属性提供值的一种方式,但它不是基本必需的。示例化
KafkaSettings
所需要的是两个字符串和一个布尔值:将它们直接提供给__init__
,并定义类方法从字典中提取它们。