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

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

Beitragvon jens » Dienstag 15. Mai 2007, 09:58

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.

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

Beitragvon EnTeQuAk » Dienstag 15. Mai 2007, 10:05

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 15. Mai 2007, 10:18

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)

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

Beitragvon EnTeQuAk » Dienstag 15. Mai 2007, 10:51

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

Beitragvon BlackJack » Dienstag 15. Mai 2007, 11:34

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 15. Mai 2007, 11:58

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=]TypeError: re.sub() second argument expected string or buffer[/code]

Aber da wir schon mal beim Thema sind. Was ist mit "buffer" eigentlich gemeint? Ein Objekt, welches __str__() hat?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Dienstag 15. Mai 2007, 12:46

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 15. Mai 2007, 16:08

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=]TypeError: re.sub() arg 2 must be a string or buffer[/code]

Ob man das mal im Bugtracker schreiben sollte?

CMS in Python: http://www.pylucid.org
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

Beitragvon birkenfeld » Dienstag 15. Mai 2007, 17:21

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/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder