2017-01-23 9 views
0

私は作業しているWebアプリケーションでいくつかのデータをグラフ化するためにpygalを使用しており、チャートの構成を外部化することをお勧めします。 (例えば)pygal.Config()にChartOptionsセクションを渡すと外部confファイルを使用してPygalチャートを設定しますか?

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

[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 

とが見つかりました:

は、だから私は、私の中のコードのconfを複製し、私のconfファイル内のセクションを書きました

どうすればいいですか?

答えて

0

私はPythonでかなり新しくなっているので、これはすべて不必要で、よく知られているか、より良い方法があります。私は厄介なことをして何も見つけられなかったので、ここにいる。

最初に私が試したことは、pygal.util.mergextend()は他のデータ型が必要な文字列を見つけられないことです。 ConfigParser.read()._セクション[your_section_here]から返されたOrderedDictの値はすべて文字列なので、適切な型に変換する必要があります。

入力:ast.literal_eval()。

これはうまくいくようですが、タイプごとに文字列である__name__のValueError( '不正な文字列')を引き上げています(オプション['__name__'])。まあ、今何?

__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()) 
... 
関連する問題