Tabulator

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
JaKlaRo
User
Beiträge: 10
Registriert: Dienstag 14. Juli 2009, 11:52
Wohnort: Bochum

Hallo,
folgende Funktion habe ich zur Nutzung in `curses` geschrieben, vielleicht gibt es noch andere Anwendungsmöglichkeiten.

Code: Alles auswählen

#! /usr/bin/envr python
# -*- coding: utf-8 -*-

def tab(string="", tab_width=8, focus='left'):
    string = str(string)
    stringlen = len(string)
    space = " " * (tab_width - stringlen % tab_width)

    if focus == 'center': # string mittig
        space = " " * ((len(space) + len(space) %2) / 2)
        string = space + string
        if (stringlen % 2) != (tab_width % 2):
            space = " " * (len(space) - 1)
    elif focus == 'right': # string rechtsbündig
        string, space = space, string
    elif focus == 'left': # string linksbündig
        pass
    return string + space

if __name__=="__main__":
    print "So wird's benutzt:"
    print tab("bla")
    print tab ("bla", focus='right') + tab("bla")
    print tab() + tab("bla", focus='right') + tab("bla")
    print tab("blablabla", focus='center') + tab("bla")
    print "\nSo nicht!"
    print tab("bla")
    print tab ("bla", focus='right'), tab("bla")
    print tab(), tab("bla",focus='right'), tab("bla")
    print tab("blablabla", focus='center'), tab("bla")
Gruß
JaKlaRo
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Die Zeilen 16 und 17 sind überflüssig. Zeile 5 würde ich auch weglassen, ein TypeError sollte schn geworfen werden, wenn es kein String ist.
Benutzeravatar
JaKlaRo
User
Beiträge: 10
Registriert: Dienstag 14. Juli 2009, 11:52
Wohnort: Bochum

Bitte sehr:

Code: Alles auswählen

#! /usr/bin/envr python
# -*- coding: utf-8 -*-

def tab(string="", tab_width=8, focus='left', fill=" "):
    if len(fill) != 1: 
        return False # entsprechende Fehlermeldung für False einfügen
    if tab_width < 2:
        tab_width = 1
    if type(string) == type(1) or type(string) == type(1.0):
        string = str(string)
    stringlen = len(string)
    space = fill * (tab_width - stringlen % tab_width)
    if focus == 'center': # string mittig
        space = fill * ((len(space) + len(space) %2) / 2)
        string = space + string
        if (stringlen % 2) != (tab_width % 2):
            space = fill * (len(space) - 1)
    elif focus == 'right': # string rechtsbündig
        string, space = space, string
    return string + space

if __name__=="__main__":
    txt = "bla"
    print tab(txt + txt + txt, focus='center', fill=".") + tab(txt, fill=".")
    print tab(12345) + tab(12.345)
    print "\nVergleich mit center, ljust und rjust."
    print (txt + txt + txt).center(8, ".") + txt.ljust(8, ".")
    print "12345".ljust(8) + "12.345".ljust(8)
Gruß
JaKlaRo
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Warum hast du denn jetzt diese (sehr seltsame) Typprüfung eingebaut? Duck Typing ist bei Python sehr beliebt, mit meiner Anmerkung über Zeile 5 meinte ich, dass die explizite Umwandlung in einen String nicht geschehen soll.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Nutze doch str.center(n).
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es ist denkbar schlecht, wenn eine Funktion, von der man den Rückgabetyp `str` erwartet unter Umständen etwas vom Typ `bool` liefert. Stell dir mal vor, du setzt damit ein paar Strings zusammen und plötzlich steht irgendwo dazwischen ein `False`, welches du vielleicht erst gar nicht bemerkst. Besser sind da auf jeden Fall Exceptions. Das unterbricht dein Programm und liefert eine passende Fehlermeldung. Das übernimmt hier aber Python für einen, wenn man denn die Zeile 5 der ersten Version weglässt. ;)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@snafu: Genau das meinte ich. Hab mich da vielleicht etwas seltsam ausgedrückt.
lunar

derdon hat geschrieben:Zeile 5 würde ich auch weglassen, ein TypeError sollte schon geworfen werden, wenn es kein String ist.
Wieso sollte ein TypeError geworfen werden, wenn man keine Zeichenkette übergibt?

@JaKlaRo
Ausrichtung heißt "alignment" auf Englisch, "focus" ist etwas anders. Außerdem geht das auch kürzer:

Code: Alles auswählen

TAB_FUNCS = {
    'left': attrgetter('ljust'),
    'right': attrgetter('rjust'),
    'center': attrgetter('center'),
    }

def tab(value='', width=8, align='left', fill=' '):
    value = str(value)
    padding = width - len(value) % width
    return TAB_FUNCS[align](value)(len(value)+padding, fill)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Da haste ein

Code: Alles auswählen

from operator import attrgetter
vergessen ;)
Antworten