我环顾四周,没有找到任何使用内置 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
。 .
一种解决方法是转换(在 eval
之后)任何 float
至 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'>
我想将“__builtins__”定义为 None
在 eval globals 中会避免加载 float
的默认定义,我在本地人中重新定义...似乎 不可能 从 eval
中取出(或替换)内置类型命名空间(如 float
, int
...)。欢迎对此提出任何建议:)
最佳答案
您可以做的是复制 ast.literal_eval()
所做的事情,但您可以先注入(inject)对 numpy.float64
构造函数的调用,而不是仅仅执行 AST。
关于python - 使用 eval() 创建 numpy.float64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475800/