Formatierungsinfos zur Terminalausgabe abspeichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

zur Terminalausgabe meiner Kalenderdaten möchte ich so etwas wie stylesheets verwenden. So ein stylesheet (in diesem Beispiel mit dem Namen 'compact') könnte ungefähr so aussehen:

Code: Alles auswählen

compact = {
    'general': {
        'distribute_evenly': False,
        'def_alignment': '<',
        'def_ellipsis': '..',
        'def_filler': '-'
    },
    'content': (
        {
            'name': 'begin_date',
            'ansi_prefix': None,
            'ansi_suffix': None,
            'startswith': '|',
            'endswith': ' | ',
            'alignment': None,
            'filler': None,
            'ellipsis': None,
            'format_spec': '%Y.%m.%d',
            'list_sep': None,
            'heading': {
                'text': 'Begins',
                'ansi_prefix': '\033[4m',
                'ansi_suffix': '\033[24m',
                'startswith': ' ',
                'endswith': '   ',
                'alignment': None,
                'filler': None,
                'ellipsis': None
            }
        },
        {
            'name': 'title',
            'ansi_prefix': None,
            'ansi_suffix': None,
            'startswith': ' | ',
            'endswith': ' |',
            'alignment': None,
            'filler': None,
            'ellipsis': None,
            'format_spec': None,
            'list_sep': None,
            'heading': {
                'text': 'Title',
                'ansi_prefix': '\033[4m',
                'ansi_suffix': '\033[24m',
                'startswith': '   ',
                'endswith': '  ',
                'alignment': None,
                'filler': None,
                'ellipsis': None
            }
        }
    )
}
Das ganze ließe sich nun über ein Modul oder eine json-Datei ablegen. In beiden Fällen gefällt mir nicht, dass man beim Ändern oder Neuanlegen eines stylesheets sehr auf die vielen Klammern, Kommatas, Anführungszeichen etc. achten muss.

Welche Möglichkeiten gibt es denn, eine solche Struktur mit möglichst wenigen Fallstricken in einer leicht zu editierenden Textdatei abzulegen? `ConfigParser` fände ich nicht schlecht, allerdings kann ich damit keine subsections anlegen...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Klingt nach einem legitimen Fall für YAML.
BlackJack

@webspider: Die YAML-Regeln sind AFAIK deutlich umfangreicher als JSON, also letztendlich komplizierter. Ich denke `ConfigObj` klingt eher nach dem was gesucht ist: https://pypi.python.org/pypi/configobj/
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man könnte außerdem überlegen, ob ungenutzte Unterpunkte wirlich explizit mit `None` ausgedrückt werden müssen, oder ob man durch bloßes Weglassen des Unterpunktes das selbe Ergebnis erzielen kann. `dict`s haben bekanntlich eine `.get()`-Methode. Diese liefert standardmäßig `None` zurück, wenn ein Schlüssel nicht vorhanden ist. Man kann aber auch einen anderen Defaultwert angeben, wenn man kein `None` haben möchte.

Eine andere Möglichkeit wäre (ich halte mich immer noch ans `dict`-Szenario): Eine Konstruktor-Funktion erstellt grundsätzlich `dict`s mit Defaultwerten sozusagen als Grundgerüst. Dem Anwender steht es dann frei, auf Wunsch bestimmte Punkte abzuändern. Oder machst du das bereits so? Wobei: Aufgrund der ganzen Verschachtelungen wird es wahrscheinlich eher unhandlich, wenn der Anwender direkt am `dict` rumfrickeln muss. Und genau das ist ja im Prinzip auch deine Fragestellung...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@webspider: Hab' mir YAML gerade mal angeschaut und muss BlackJack Recht geben. Ein YAML-Dokument an sich schaut zwar übersichtlich aus, die Regeln (Doppelpunkt am Ende→dictkey, Bindestrich am Anfang→list-Element etc.) bergen dafür einiges an Fehlerpotential.

@snafu: Die `None`-Werte habe ich nur aufgeführt, um zu demonstrieren, wie umfangreich ein solches stylesheet potentiell sein kann. Nicht angegebene Werte werden letztlich mit default-Werten ersetzt. Dafür schicke ich das stylesheet zur Validierung und Bestückung mit default-Werten nochmals durch eine Funktion.
Mir geht es tatsächlich um die Frage, wie ich dem Nutzer eine Möglichkeit geben kann, innerhalb einer simpel gehaltenen Textdatei ein solches stylesheet zu editieren.

@BlackJack: `ConfigObj` wäre tatsächlich das, was ich suche. Jetzt bin ich aber doch am überlegen, ob ich Unterpunkte irgendwie anderst auflöse und den in Python bereits enthaltenen `ConfigParser` verwende. Das würde mir eine Abhängigkeit ersparen. Bin mir noch unsicher.

Danke jedenfalls schon mal für die Antworten!

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten