I'm trying to parse a Dict of [str,str] with key value pair into a object (class). The first contains the name of attributes and the second the value.
ex: [('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]
The code to parse is the next:
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)
The parser works but the type of the value is altered. For example, AUTO_COMMIT attr as type bool but with setattr the type changed into str. The cast of the value into the good type not work.
I don't know the Python language.
How to resolve this problem ?
Thanks
You can solve this using below code,
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)
You can solve this issue by checking the key and if it is equal to AUTO_COMMIT then you can cast the string value to the bool value by using bool() method.
But note that this is a specific solution for your code. So it is better to add the values with their actual type (as you needed) when making the dictionary. Then you do not need any casting.
For an example, In this case, you can use this,
[('CLIENT_ID','123456'), ('AUTO_COMMIT', False), ('BROKER_URL', 'http://foo.bar')]
(store False as boolean instead of string)
instead of this,
[('CLIENT_ID','123456'), ('AUTO_COMMIT', 'False'), ('BROKER_URL', 'http://foo.bar')]