python - python: 动态类型转换 - unicode 对象到 python 对象的转换
问题描述
这是我在数据管道项目中面临的问题。我有 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 ?这种方法有更好的选择吗?我检查了这个,但它不起作用
接受所有建议
解决方案
在您的第一个示例中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()
(如另一个答案所建议的那样),因为它可能会导致重大安全风险。这就是我使用__builtin__
/builtins
模块并getattr()
检索float(...)
函数的原因。
您还可以创建一个映射(即 a dict
),将 unicode 字符串映射到其相应的函数(由 this 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
使用映射是最安全的方法,但它会将您的“动态性”限制为仅映射中列出的类型。
推荐阅读
- javascript - 如何在根目录中获取外部文本文件并使用 javascript 将其附加到 p 元素?
- java - 在netbeans中单击运行时Jpanel不显示
- python - Matplotlib:最后 y 刻度标签不可见,边距为 0
- html - 无法弄清楚如何将文本水平对齐到输入的左侧
- sql - CREATE FUNCTION 后面的代码是一个字符串意味着什么?
- javascript - 仅防止未定义的值
- python - 遍历列表和删除元素的最佳方法是什么?我目前的做法会导致元素被跳过
- scala - Spark,拥有大量内存,由于 OOM 无法加入数据帧
- python - TensorFlow 中分类 CNN 的近随机猜测准确度?
- laravel - 在查询生成器上评估两个字段的最简洁方法是什么