python:动态类型转换 - 到python对象转换的unicode对象

时间:2018-05-03 06:46:16

标签: python django-models type-conversion python-unicode dynamictype

这是我面临的数据管道项目的问题。 我有2个数据源。一个包含所有用户数据,另一个包含我们必须处理的所有列的元数据,从用户数据到输出。

所以python很适合动态类型转换,就像我说的那样

a = float
b = "25.123"
c = a(b)
print(c)
>> 25.123

这就是我想要做的,我想动态输入强制转换值以便正确处理它们。从元数据数据源检索类型。 问题是当我对元数据进行django模型查询时,我得到了unicode对象。

a = model.objects.filter(id = 'id') # get the type variable from the meta-data
a = a[0]['type']
print(a)
>> u'float'
a("123.123")
>> TypeError: 'unicode' object is not callable

如何将此u'float'转换为浮动? 这种方法有没有更好的选择? 我检查了this,但它不起作用

对所有建议开放

3 个答案:

答案 0 :(得分:2)

在您的第一个示例a = float中,a是内置函数,但在第二个示例中,a = u"float"a是一个unicode字符串。如果您想要转换为内置类型的完整“动态性”而无需创建映射,则可以执行以下操作:

# for Python 2
a = u"float"
b = "123.123"
import __builtin__
print getattr(__builtin__, a.decode())(b) 
# 123.123

# for Python 3+
a = u"float"
b = "123.123"
import builtins
print(getattr(builtins, a)(b))
# 123.123

我建议您 使用eval()(由another answer建议),因为它可能会导致重大安全风险。这就是我使用__builtin__ / builtins模块和getattr()来检索float(...)函数的原因。

你也可以创建一个映射(即一个dict),将unicode字符串映射到它的相应函数(由comment建议):

# both Python 2 and 3
a = u"float"
b = "123.123"
mapping = {u"float": float, u"int": int, u"str": str, u"list": list}
print(mapping[a](b))
# 123.123

使用映射是最安全的方法,但它将“动态性”限制为仅映射中列出的类型。

答案 1 :(得分:1)

您可以使用eval()函数来评估代码,但是您需要小心该功能!否则,您可能会看一下post。另一种解决方案是预先定义允许的类型,并将它们收集到使用typeName的{​​{1}}字典中。

答案 2 :(得分:0)

您可以使用numpy库中的astype

import numpy as np
np.array(('213.123')).astype(a)

不可否认,这需要通过数组,因为astype()适用于numpy-arrays - 但它可以将字符串计算为类型。