Encoding Problem

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.
BlackJack

@myxin: Es hat mit einem ``lambda``-Ausdruck gemein, dass eine neue Funktion erstellt wird, ohne ein ``def`` also potentiell eine Funktion die keinen Namen haben muss, also zum Beispiel direkt irgendwo als Argument übergeben werden kann. In diesem Fall binde ich die Funktion an einen Namen, damit wäre ein ``lambda`` eher die falsche Wahl, weil es keinen Sinn macht ein Konstrukt zu verwenden was dazu gedacht ist anonyme Funktionen zu erstellen und die dann aber gleich an einen Namen zu binden. Für so etwas ist ``def`` vorgesehen.

Trotzdem zum Verständnis die Funktion noch mal in den beiden Varianten:

Code: Alles auswählen

clean_filename = lambda filename: re.sub(re.escape(' <>:"/\|?*'), '_', filename)

def clean_filename(filename):
    return re.sub(re.escape(' <>:"/\|?*'), '_', filename)
Die Frage mit dem C-Parameter habe ich nicht verstanden!?
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

@BlackJack,

danke für die Erklärung.

Bezüglich dem C Parameter, manche C Function erwartet z. B. als Callback
einen Pointer auf eine Funktion. Kann ich dann z. B.
ctypes.pointer(clean_filename) übergeben?

Bezgl. dem clean_filename noch eine Frage.
Ich musste den Aufruf ändern in

Code: Alles auswählen

clean_filename = partial(re.sub,'[{0}]'.format(re.escape(' <>:"/\|?*')), '_') 
da ansonsten nichts ersetzt wurde. Ich denke das macht Sinn, oder?

Eine andere Stelle bereitet mir ebenso noch ein Verständnisproblem.

Code: Alles auswählen

def iter_items(document):
    for item in document.findall(ITEM_TAG):
        yield dict(
            (key, get_text(item, tag_name))
            for key, tag_name in ITEM_KEY_TO_TAG_NAME.iteritems()
        )
Ich habe die Doku und verschiedene Seiten zu yield gelesen aber noch immer nicht das Gefühl das
ich verstanden habe um was es da geht.

In der Funktion wird als erstes in dem "XML-Dokument" nach allen item tags gesucht,
dann wird mit dieser Liste die for Schleife durchlaufen und ein item dictionary
aufgebaut. Nur wie geschieht das wirklich und welchen Zweck erfüllt hier yield?

Mein Verständnis hierbei ist:

Code: Alles auswählen

for key, tag_name in ITEM_KEY_TO_TAG_NAME.iteritems()
Es wird über das bestehende ITEM_KEY_TO_TAG_NAME dictionary iteriert und
für jeden Schlüssel und Wert

Code: Alles auswählen

dict( (key, get_text(item, tag_name))
ein neues Paar Schlüssel und ermittelter Wert in das item dictionary geschrieben.

Und was macht das yield??

Danke
Claudia
BlackJack

@myxin: Das ``yield`` ist der Punkt an dem die Funktion angehalten wird und der Wert dahinter wird von dem Generator den die Funktion zurückgibt, als Wert geliefert. Statt `findall()` wäre es vielleicht sinnvoller gewesen wenn ich da `finditer()` verwendet hätte, damit die Liste nicht aufgebaut wird.
Antworten