2016-02-29 65 views
1

我注意到,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]) 

我怎么能阻止它这样做?
(后续的代码barfing的 “...”。):

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, \ 
    } \ 
    ) \ 
) 
+5

这与'eval'无关。如果您在没有'eval'的情况下评估相同的表达式,您会得到相同的结果。只有在将numpy数组显示为字符串时,才会出现'...'。 – interjay

+2

看起来你正在一个字符串上运行'eval',然后复制结果并粘贴到不同的代码行中。为什么这样做?为什么不只是'initializer.channel_response = array([1。/ 5.0e-12] + [0。] * 1023)'? – Kevin

+0

因为我正在从文件中读取几个不同的配置。 – dbanas

回答

3

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

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

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

+0

好的,我明白了;谢谢!所以,如果我想从人工编辑的文件中读取配置信息到正在运行的Python脚本中,那么最好的方法是什么? – dbanas

+0

常用的是模块configparser,有些也直接使用python模块并在那里设置常量。取决于谁将改变这些价值观。 – hruske