使用 cast 从 Dict 设置类的属性

问题描述 投票:0回答:1

我正在尝试将具有键值对的 [str,str] 的 Dict 解析为对象(类)。 第一个包含属性名称,第二个包含值。

例如:

[('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_COMMIT attr 为 bool 类型,但使用

setattr
类型变为 str。将值转换为良好类型是行不通的。 我不懂 Python 语言。

如何解决这个问题?

谢谢

python python-3.x dictionary casting setattribute
1个回答
0
投票

您可以使用以下代码解决此问题,

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:
            for key, value in d.items():
                attr = self.__getattribute__(key)
                
                # change as follows
                if key == "AUTO_COMMIT":
                    value = bool(value)

                self.__setattr__(key, value)

您可以通过检查

key
来解决这个问题,如果它等于
AUTO_COMMIT
那么您可以使用
string
方法将
bool
值转换为
bool()
值。

但请注意,这是针对您的代码的特定解决方案。因此,在制作

type
时,最好将值与它们的实际
dictionary
(根据需要)相加。那么你不需要任何铸造。

举个例子,在这种情况下,你可以使用这个,

[('CLIENT_ID','123456'), ('AUTO_COMMIT', False), ('BROKER_URL', 'http://foo.bar')]

(将

False
存储为布尔值而不是字符串)

而不是这个,

[('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]

© www.soinside.com 2019 - 2024. All rights reserved.