Seite 1 von 1

Tabulator

Verfasst: Donnerstag 23. Juli 2009, 17:50
von JaKlaRo
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

Verfasst: Donnerstag 23. Juli 2009, 18:39
von derdon
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.

Verfasst: Donnerstag 23. Juli 2009, 21:49
von JaKlaRo
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

Verfasst: Donnerstag 23. Juli 2009, 22:04
von derdon
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.

Verfasst: Donnerstag 23. Juli 2009, 22:13
von Dauerbaustelle
Nutze doch str.center(n).

Verfasst: Freitag 24. Juli 2009, 06:45
von snafu
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. ;)

Verfasst: Freitag 24. Juli 2009, 12:25
von derdon
@snafu: Genau das meinte ich. Hab mich da vielleicht etwas seltsam ausgedrückt.

Verfasst: Freitag 24. Juli 2009, 13:12
von 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)

Verfasst: Freitag 24. Juli 2009, 13:22
von derdon
Da haste ein

Code: Alles auswählen

from operator import attrgetter
vergessen ;)