2013-01-19 8 views
11

Ich habe versucht, ein Wörterbuch mit einer Zeichenfolge für jeden Schlüssel und eine Lambda-Funktion für jeden Wert zu erstellen. Ich bin nicht sicher, wo ich falsch liege, aber ich vermute, dass es entweder mein Versuch ist, ein Lambda in einem Wörterbuch zu speichern, oder die Tatsache, dass mein Lambda einen Shortcut-Operator verwendet.Speichern von Lambdas in einem Wörterbuch

Code:

dict = { 
    'Applied_poison_rating_bonus': 
     (lambda target, magnitude: target.equipmentPoisonRatingBonus += magnitude) 
} 

Der Fehler ausgelöst wird, ist SyntaxError: invalid syntax und nach rechts an meinem +=. Sind Shortcut-Operatoren in Lambdas nicht erlaubt, oder bin ich noch weiter vom Track entfernt, als ich dachte?

Aus Gründen der Vernunft habe ich Hunderte von sehr ähnlichen Paaren weggelassen (Es ist nicht nur ein kleines Wörterbuch ist.)

EDIT:

Es ist mein Problem etwas zu vergeben war scheint mit dem Versuch, innerhalb eines Lambda-Ausdrucks. Wie auch immer, mein zu lösendes Problem ist also, wie kann ich eine Methode bekommen, die nur den Schlüssel zu diesem Wörterbuch kennt, um das in meinem (gebrochenen) Code definierte Feld ändern zu können?

Würde irgendeine Art von Aufruf an eval() helfen?

EDIT_FINAL:

Die functools.partial() -Methode zu diesem erweiterten Teil der Frage empfohlen wurde, und ich glaube, dass es nach der Erforschung, finde ich es ausreichend, um mein Problem zu lösen.

Antwort

24

Sie können Zuweisungen in einem Ausdruck nicht verwenden, und ein lambda nimmt nur einen Ausdruck.

Sie können speichern lambdas in Wörterbücher ganz gut anders:

dict = {'Applied_poison_rating_bonus' : (lambda target, magnitude: target.equipmentPoisonRatingBonus + magnitude)} 

Die obige lambda natürlich gibt nur das Ergebnis, wird es nicht target.equimentPoisonRatingBonus an Ort und Stelle verändern.

+0

Interessant, aber jetzt, was auch immer mein Lambda anruft, muss ich wissen, um das Ergebnis zu diesem bestimmten Feld hinzuzufügen. Irgendwo in der Nähe? – BlackVegetable

+1

@BlackVegetable: Verwenden Sie stattdessen eine geeignete Funktion, oder fügen Sie der Klasse 'target' eine Methode hinzu. –

+0

Ich habe ungefähr 150 dieser (ähnlichen) Elemente in diesem Wörterbuch. Somit wird durch die Verwendung einer geeigneten Funktion für jeden der Zweck dieses Wörterbuchs vereitelt. Hmm ... – BlackVegetable

Verwandte Themen