re.sub() und "TypeError: expected string or buffer"

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?
Zuletzt geändert von jens am Dienstag 15. Mai 2007, 10:17, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

Code: Alles auswählen

TypeError: re.sub() arg 2 must be a string or buffer
Ob man das mal im Bugtracker schreiben sollte?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das kannst du schon (bitte als RFE), aber ohne Patch wird nicht viel laufen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten