【问题标题】:python: dynamic type casting - unicode object to python object conversionpython: 动态类型转换 - unicode 对象到 python 对象的转换
【发布时间】:2018-10-13 09:13:07
【问题描述】:

这是我在数据管道项目中面临的问题。 我有 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,但它不起作用

接受所有建议

【问题讨论】:

  • 我会创建一个从字符串到类型的显式映射。

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


【解决方案1】:

在您的第一个示例中,a = floata 是一个内置函数,但在您的第二个示例中,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

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

【讨论】:

  • 我们如何处理日期或日期时间对象?假设 a = u"date",getattr 将无法正常工作
  • 明白了,所以不要使用 builtin,而是使用 datetime
【解决方案2】:

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

【讨论】:

  • 最好有一个预定义的dict映射,eval()以后可能会出问题
  • 是的,这就是为什么我强调需要小心这一事实。可能会出现很多安全漏洞,所以我实际上不推荐eval(),但这是我想到的第一个。
【解决方案3】:

您可以使用 numpy 库中的 astype

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多