在评估列表时如何防止Python的eval()使用“...”?

时间:2016-02-29 16:32:20

标签: python eval

我注意到Python的 eval ()函数缩短了一些列表,使用“...”:

In [10]: eval ('array([1. / 5.0e-12] + [0.]*1023)')
Out[10]: 
array([  2.00000000e+11,   0.00000000e+00,   0.00000000e+00, ...,
         0.00000000e+00,   0.00000000e+00,   0.00000000e+00])

如何防止它这样做?
(后续代码正在对“......”进行抨击。):

  File "<string>", line 1
    initializer.channel_response = array([  2.00000000e+11,   0.00000000e+00,   0.00000000e+00, ...,
                                                                                                ^
SyntaxError: invalid syntax

以下是我创建的一个配置文件中的典型“行”:

('Pretap = 0', \
    ({'root_name'        : 'example_tx', \
      'tx_tap_np1'       : 0, \
      'tx_tap_nm1'       : 0, \
      'tx_tap_nm2'       : 0, \
     }, \
     {'channel_response' : array([1. / 5.0e-12] + [0.]*1023), \
      'sample_interval'  : 5.0e-12, \
     } \
    ) \
)

1 个答案:

答案 0 :(得分:3)

您正试图以错误的方式序列化(保存)数组。 Numpy有np.savenumpy.savetxt,您可以使用它来保存数据,然后将numpy.load或numpy.loadtxt从文件中保存。

不要使用eval,这样做既不安全也不明智,因为对象表示可能无法显示可靠地再现某些对象所需的所有信息。

如果你正在加载人类可读的配置,常见的方法是通过模块configparser