Über Schleife mit Funktion iterieren (not subscriptable)

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
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Hallo,

ich versuche gerade, mir für das bbcode-Plugin von Nikola einige Formatierungsbefehle neu hinzuzufügen. Dazu muss ich dem bbcode-Parser einige neue Befehle hinzufügen.

Der Quellcode des Plugins ist hier: https://github.com/getnikola/plugins/bl ... /bbcode.py. Bei Zeile 56 könnte man dann nun eigene Formatierer einrichten. Da ich das ungern in diese bbcode.py selbst schreiben möchte (kann eventuell aktualisiert werden, so dass meine ganzen eigenen Änderungen verschwinden würden), möchte ich das in einer eigenen Datei auslagern, die dann dort einfach nur eingebunden wird.

Jedenfalls fügt man dort folgendermaßen neue Befehle hinzu (http://bbcode.readthedocs.org/en/latest/formatters.html):

Code: Alles auswählen

parser.add_formatter('quote', render_quote, strip=True, swallow_trailing_newline=True)
Ich habe nun eine Funktion geschrieben und wollte diese Funktion in eine Liste packen, dessen Inhalte mit einer Schleife alle hinzugefügt werden:

Code: Alles auswählen

def add_image(tag_name, value, options, parent, context):
   img_string = '<img src="{}"'.format(value)
   for option in options.items():
       img_string = img_string + ' {}="{}"'.format(option[0], option[1])
   return img_string + '>'

advanced_formatters = ["img", add_image]
und zum Hinzufügen:

Code: Alles auswählen

        for formatter in advanced_formatters:
            self.parser.add_formatter(formatter[0], formatter[1], strip=True, swallow_trailing_newline=True)
Jetzt kriege ich allerdings die „TypeError: 'function' object is not subscriptable“ als Fehlermeldung. Das wird wahrscheinlich irgendwas mit dem Iterieren über die Liste zu tun haben, aber wie kann ich das beheben? Ich würde ungern jeden einzelnen Formatierungsbefehl manuell dort eintragen, sondern alle Einträge aus einer Liste eintragen lassen.

Ich dachte immer, Python arbeitet größtenteils intern mit Zeigern, oder nicht? In advanced_formatters[1] steht ja auch die Funktion drin, also kann ich ja advanced_formatters[1](blabla) ausführen und das funktioniert. Wieso kann ich dann nicht mit einer Schleife darüber laufen und der Verweis bleibt erhalten?

Danke :)
BlackJack

@Hellstorm: Du iterierst über die Elemente in `advanced_formatters`. Das sind *zwei* Elemente. 'add' und eine Funktion. Im ersten Schleifendurchlauf ist `formatter` an die Zeichenkette 'img' gebunden, da kann man auf die Elemente 0 und 1 zugreifen, dass sind 'i' und 'm', und im zweiten Schleifendurchlauf ist `formatter` an die Funktion gebdunden. Und bei Funktionen kann man, wie die Fehlermeldung deutlich sagt, nicht per Index auf Elemente der Funktion zugreifen. Du möchtest wahrscheinlich in die Liste `advanced_formatters` Tupel oder Listen mit jeweils zwei Elementen als Elemente stecken und über *diese* dann iterieren.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Tatsächlich, daran lag es. Das hatte ich sogar so geplant, aber dann die Klammern vergessen... Hätte ich dort direkt zwei Funktionen eingetragen, hätte ich den Fehler wahrscheinlich gar nicht erst gemacht.

Danke!
Antworten