Seite 1 von 1
re.sub() und "TypeError: expected string or buffer"
Verfasst: Dienstag 15. Mai 2007, 09:58
von jens
Hatte gerade Tomaten auf den Augen und bei
re.sub() die Argumente vertauscht. Ergebnis:
TypeError: expected string or buffer
Ich brauchte recht lange, bis ich dahinterkam, was der Traceback mir sagen wollte.
Ich musste mir erst ein kleines Test-Skript schreiben:
Code: Alles auswählen
import re
def func(matchobj):
print "gefunden:", matchobj.group(1)
text = "bla X123X jojo"
regex = re.compile("X(.*?)X")
# richtig:
regex.sub(func, text)
# Falsch (TypeError: expected string or buffer):
regex.sub(text, func)
Der Fehlertext ist IMHO schwer zu verstehen, oder nicht?
Ob man da nicht einen Besseren Fehlertext ausgeben könnte?
Verfasst: Dienstag 15. Mai 2007, 10:05
von EnTeQuAk
Er erwartet nen String oder nen Buffer. Wenn ich ihm ne Funktion gebe... is klar, das er da meckert.
Ich weiß nicht, was du hast. Ich finde, das sind zwar meißt schwer zu findende Fehler... aber die Fehlermeldung ist gut.
MfG EnTeQuAk
Verfasst: Dienstag 15. Mai 2007, 10:18
von jens
Ja, aber man kann ihm nicht nur einen String oder Buffer geben, sondern auch ein callable... Das mache ich ja mit regex.sub(func, text)
Verfasst: Dienstag 15. Mai 2007, 10:51
von EnTeQuAk
Ja, aber man kann ihm nicht nur einen String oder Buffer geben, sondern auch ein callable... Das mache ich ja mit regex.sub(func, text)
Welches im Enddefekt einen String zurückliefert.
MfG EnTeQuAk
Verfasst: Dienstag 15. Mai 2007, 11:34
von BlackJack
Die Ausnahme bezieht sich ja wohl auf das zweite Argument, was eben keine Funktion, sondern nur eine Zeichenkette (oder buffer) sein darf. Ist damit doch korrekt.
Verfasst: Dienstag 15. Mai 2007, 11:58
von jens
BlackJack hat geschrieben:Die Ausnahme bezieht sich ja wohl auf das zweite Argument
Du sagst es. Schönere wäre es aber doch wohl, das die Fehlermeldung das auch sagt, oder nicht?
Mal ein Vorschlag:
Code: Alles auswählen
TypeError: re.sub() second argument expected string or buffer
Aber da wir schon mal beim Thema sind. Was ist mit "buffer" eigentlich gemeint? Ein Objekt, welches __str__() hat?
Verfasst: Dienstag 15. Mai 2007, 12:46
von BlackJack
Wäre schöner, aber muss nicht unbedingt sein.
Das "buffer interface" hat etwas mit C-Datentypen zu tun:
http://docs.python.org/api/buffer-structs.html
Verfasst: Dienstag 15. Mai 2007, 16:08
von jens
Ach, ich hab gerade einen etwas ähnlichen Fehler, der Präziser ist:
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Nach dem Schema sollte es vielleicht so lauten:
Ob man das mal im Bugtracker schreiben sollte?
Verfasst: Dienstag 15. Mai 2007, 17:21
von birkenfeld
Das kannst du schon (bitte als RFE), aber ohne Patch wird nicht viel laufen.