使用eval()创建numpy.float64

我环顾四周,但没有找到任何使用内置eval函数创建numpy.float64的信息.

我想要的是这样的:

In [1]: x = eval("1.0")
In [2]: type(x)
Out[2]: <type 'float'>

至:

In [1]: x = eval("1.0")
In [2]: type(x)
Out[2]: <type 'numpy.float64'>

真正的问题比上面的简单示例还要糟糕,因为传递给eval的参数通常是具有许多键和值的字典.因此,将无法使用类似numpy.float64(“ 1.0”)的内容.

为了给您我正在使用的具体真实数据,以下是字符串的样子(从文件中读取):

data_str = '{"var_x": {"value": 1.23, "error": 0.25, "unit": "unit name"},
            "var_y": {"value": 1e+4, "error": 1.3e1, "log": False},
            "var_z": ["a", {"x":1, "y":2}, (1, 2, 3), None]'
data = eval(data_str)

然后,我希望type(data [“ var_x”] [“ value”])返回< type'numpy.float64'>

你们有什么建议吗?我错过了一个明显的方法吗?

编辑

我将在data_str中处理的数字精度不会超过15-16位.
因此,仅将字符串转换为float或numpy.float64并不重要.但是,这些值将传递给一些复杂的函数(乘,除)…因此,为了避免任何错误传播,我必须使用numpy.float64.
一种解决方法是将任何float转换(在eval之后)为numpy.float64,但是最好使用eval进行直接解释.

编辑#2

我想知道为什么这不起作用:

In [1]: import numpy as np
In [2]: x = eval("1.4", {"__builtins__":None, "np":np}, {"float":np.float64})
In [3]: type(x)
Out[3]: <type 'float'>

我认为通过在eval全局变量中将“ __builtins__”定义为None可以避免它为float加载默认定义,而我在本地变量中重新定义了…似乎不可能从eval中取出(或替换为该函数)内置类型命名空间(如float,int …).任何对此表示欢迎:)

解决方法:

您可以做的是复制ast.literal_eval()所做的事情,但是您可以首先注入对numpy.float64构造函数的调用,而不仅仅是执行AST.

上一篇:c#-与类实例具有相同类型的成员


下一篇:HTML5-Android平板电脑-输入类型编号