2017-01-23 73 views
0

我正在使用pygal來繪製我正在處理的Web應用程序中的一些數據,並認爲將圖表的配置進行外部化將是一個好主意。用外部配置文件配置一個pygal圖表?

所以我在我的重複代碼的conf我的conf文件寫了一節:

[ChartOptions] 
x_label_rotation: -75 
x_labels_major_every: 5 
show_minor_x_labels: False 
range: (30,100) 
stroke_style: {'width':8} 
title: Chart Title 

,發現經過ChartOptions部分(例如)pygal.Config()導致

File "/usr/local/lib/python2.7/dist-packages/pygal/util.py", line 370, in mergextend 
    if list1 is None or _ellipsis not in list1: 

我該怎麼做?

回答

0

我在Python上相當新,所以也許這是不必要的,衆所周知或存在更好的方法。我有一堆麻煩,找不到任何東西,所以我們在這裏。

我首先想到的是pygal.util.mergextend()不喜歡在期望其他數據類型的地方找到字符串。從ConfigParser.read()._節[your_section_here]返回的OrderedDict中的值都是字符串,因此需要將它們轉換爲適當的類型。

請輸入:ast.literal_eval()。

這看起來好像會起作用,但不斷在__name__值(每個類型爲str,選項['__name__'))上引發ValueError('格式錯誤的字符串')。那麼,現在呢?

我並不真的需要__name__的值,所以我用pop()將它從字典中刪除,它保留了title值。我想使用title,知道可能是每個pygal的字符串,並控制了它的值,那麼可以做些什麼?

ast.literal_eval()的文檔強調它允許使用字符串,因此在conf文件中添加引號至title值似乎是「合理的」,並且工作正常。

把所有在一起,並加入燒瓶的組合,我們得到:

的conf文件:

... 
[ChartOptions] 
x_label_rotation: -75 
x_labels_major_every: 5 
show_minor_x_labels: False 
range: (30,100) 
stroke_style: {'width':8} 
# note added quotes below 
title: "Chart Title" 
... 

app.py:

import ConfigParser 
import ast 
import pygal 
from pygal import Config 
from flask import Flask, render_template 
... 
config = ConfigParser.ConfigParser() 
config.read('my.conf') 
chart_options = config._sections[CHART_SECTION] 
chart_options.pop('__name__') 
for key in chart_options.keys(): 
    chart_options[key] = ast.literal_eval(chart_options[key]) 

@app.route('/route') 
def a_route(): 
    global chart_options # haven't made this into a class yet... 
    chart_config = Config(**chart_options) 

    chart = pygal.Line(chart_config) 
    ... 
    # add data and finalize chart setup 
    ... 
    return render_template('route.html', chart=chart.render()) 
...