python - 使用 eval() 创建 numpy.float64

标签 python types numpy eval

我环顾四周,没有找到任何使用内置 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 位。 所以将字符串转换为 floatnumpy.float64仅出于该目的并不重要。然而,这些值将被传递给一些复杂的函数,乘法、除法……因此为了避免任何错误传播,我必须使用 numpy.float64。 . 一种解决方法是转换(在 eval 之后)任何 floatnumpy.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 中取出(或替换)内置类型命名空间(如 floatint ...)。欢迎对此提出任何建议:)

最佳答案

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

关于python - 使用 eval() 创建 numpy.float64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475800/

相关文章:

python - 如何在 Mechanize/Python 中设置隐藏形式的值?

python - 检查 python 字典中的值列表中的值是否存在于另一个字典中

python - 理解 Python 中的阶乘

c++ - MPI中的MPI_Type_struct和MPI_Type_create_struct有什么区别?

python - Python 中类型提示的好处是什么?

types - 戈朗 : Export C fields to be externally visible using CGo

numpy - 使用 apt-get 安装 numpy 最新包

python - 为什么异常是可迭代的?

python - 检查数组是否是数组列表的元素

python - 在 Python 中重新使用序列作为列表的一部分