gpt4 book ai didi

Python:获取类型并转换为这种类型

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:05 24 4
gpt4 key购买 nike

我是 Python 的新手。我有一个包含一些字段的对象,我有一个字段名称和值的列表,但此列表中的所有值都是字符串。我需要找到一个对象字段并分配值。我已经找到了如何找到这个领域。但是,我遇到了类型转换问题。

例如:

class SomeEntity:

def __init__(self):
self.id = 0
self.name = ""
self.some_attr = {}


def applyValues(entity, list_of_values):
for key, value in list_of_values:
if hasattr(entity, key):
setattr(entity, key, value) # !!! here is the problem to convert to type

我需要这样的东西:

x = getattr(entity, key)
type_attr = type(x)
converted = type_attr(value)
setattr(entity, key, converted)

我该怎么做?或者我可以使用其他方式吗?

最佳答案

如果值字符串是有效的 Python 文字,您可以使用 ast.literal_eval安全地将这些字符串评估为 Python 对象。

import ast

class SomeEntity:
def __init__(self):
self.id = 0
self.name = ""
self.some_attr = {}

def apply_values(entity, list_of_values):
for key, value in list_of_values:
if hasattr(entity, key):
converted = ast.literal_eval(value)
setattr(entity, key, converted)

entity = SomeEntity()

attr_list = [
('id', '42'),
('name', '"the entity"'),
('some_attr', '{"one": 1, "two": 2}'),
]
apply_values(entity, attr_list)

x = entity.id
print(x, type(x))
x = entity.name
print(x, type(x))
x = entity.some_attr
print(x, type(x))

输出

42 <class 'int'>
the entity <class 'str'>
{'one': 1, 'two': 2} <class 'dict'>

请注意,我们还可以将属性名称和值字符串放入 dict 中:

attr_dict = {
'id': '42',
'name': '"the entity"',
'some_attr': '{"one": 1, "two": 2}'
}

apply_values(entity, attr_dict.items())

正如 Alfe 在评论中提到的那样,该代码忽略了实体属性的类型。这是一个考虑了现有属性类型的修改版本。

import ast

class SomeEntity:
def __init__(self):
self.id = 0
self.name = ""
self.some_attr = {}
self.level = 0.0

def apply_values(entity, list_of_values):
for key, value in list_of_values:
if hasattr(entity, key):
type_attr = type(getattr(entity, key))
converted = type_attr(ast.literal_eval(value))
setattr(entity, key, converted)

entity = SomeEntity()

attr_dict = {
'id': '42',
'name': '"the entity"',
'some_attr': '{"one": 1, "two": 2}',
'level': '5',
}

apply_values(entity, attr_dict.items())

for k, v in entity.__dict__.items():
print(repr(k), repr(v), type(v))

输出

'id' 42 <class 'int'>
'name' 'the entity' <class 'str'>
'some_attr' {'one': 1, 'two': 2} <class 'dict'>
'level' 5.0 <class 'float'>

关于Python:获取类型并转换为这种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42645372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com