2016-02-29 68 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