Code-Stücke können hier veröffentlicht werden.
JaKlaRo
User
Beiträge: 10 Registriert: Dienstag 14. Juli 2009, 11:52
Wohnort: Bochum
Donnerstag 23. Juli 2009, 17:50
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
Donnerstag 23. Juli 2009, 18:39
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.
JaKlaRo
User
Beiträge: 10 Registriert: Dienstag 14. Juli 2009, 11:52
Wohnort: Bochum
Donnerstag 23. Juli 2009, 21:49
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
Donnerstag 23. Juli 2009, 22:04
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.
snafu
User
Beiträge: 6833 Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen
Freitag 24. Juli 2009, 06:45
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.
lunar
Freitag 24. Juli 2009, 13:12
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