Я довольно новичок в Python, так что, возможно, это все лишнее, хорошо известно или существует лучший способ. У меня была куча неприятностей и я ничего не мог найти, так что мы здесь.
Первое, что я разработал, это то, что pygal.util.mergextend() не любит находить строки, где он ожидает других типов данных. Значения в OrderedDict, возвращаемые из разделов ConfigParser.read() ._ [your_section_here], являются строками, поэтому их нужно преобразовать в их правильный тип.
Введите: ast.literal_eval().
Это похоже на то, что это сработает, но продолжало поднимать значение ValueError («неправильная строка») на значение __name__
, которое было str, для каждого типа (опции ['__name__
']). Ну, а теперь что?
Мне действительно не нужно значение __name__
, поэтому я использовал pop()
, чтобы удалить его из словаря, который оставил значение title
. Я хотел использовать title
, знал, что может быть строкой на один пигаль и иметь контроль над ее стоимостью, так что же можно сделать?
Документы для ast.literal_eval()
настаивают на том, что он позволяет использовать строки, поэтому добавление котировок значения 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())
...