python: 动态类型转换 - unicode 对象到 python 对象的转换
python: dynamic type casting - unicode object to python object conversion
这是我在数据管道项目中遇到的问题。
我有 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' 转换为 float ?
这种方法有更好的选择吗?
我查看了 this,但它不起作用
接受所有建议
您可以使用eval()
函数来计算代码,但您需要小心使用该函数!否则,您可能会看看 post。另一种解决方案是预定义允许的类型并将它们收集在字典映射 typeName
和 typeConstructor
.
中
在您的第一个示例中,a = float
、a
是一个内置函数,但在您的第二个示例中,a = u"float"
、a
是一个 unicode 字符串。如果你想在不需要创建映射的情况下转换为完整的 "dynamicness" 内置类型,你可以这样做:
# 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()
(如) because it could lead to major security risks. This is why I used the __builtin__
/builtins
模块和getattr()
检索 float(...)
函数。
您还可以创建一个映射(即 dict
),将 unicode 字符串映射到其对应的函数(由 建议):
# 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
使用映射是最安全的方法,但它会将您的 "dynamicness" 限制为仅映射中列出的类型。
您可以使用 numpy 库中的 astype
:
import numpy as np
np.array(('213.123')).astype(a)
诚然,这需要通过一个数组,因为 astype()
适用于 numpy 数组 - 但它可以将字符串计算为类型。
这是我在数据管道项目中遇到的问题。 我有 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' 转换为 float ? 这种方法有更好的选择吗? 我查看了 this,但它不起作用
接受所有建议
您可以使用eval()
函数来计算代码,但您需要小心使用该函数!否则,您可能会看看 post。另一种解决方案是预定义允许的类型并将它们收集在字典映射 typeName
和 typeConstructor
.
在您的第一个示例中,a = float
、a
是一个内置函数,但在您的第二个示例中,a = u"float"
、a
是一个 unicode 字符串。如果你想在不需要创建映射的情况下转换为完整的 "dynamicness" 内置类型,你可以这样做:
# 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()
(如__builtin__
/builtins
模块和getattr()
检索 float(...)
函数。
您还可以创建一个映射(即 dict
),将 unicode 字符串映射到其对应的函数(由
# 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
使用映射是最安全的方法,但它会将您的 "dynamicness" 限制为仅映射中列出的类型。
您可以使用 numpy 库中的 astype
:
import numpy as np
np.array(('213.123')).astype(a)
诚然,这需要通过一个数组,因为 astype()
适用于 numpy 数组 - 但它可以将字符串计算为类型。