2013-01-19 18 views
11

Her anahtar için bir dize ve her değer için bir lambda işlevi olan bir sözlük oluşturmaya çalışıyorum. Nerede yanlış gittiğimi bilmiyorum ama ilk olarak bir lambda bir sözlükte saklamak için benim denememden ya da lambda'mın bir kısayol operatörü kullanmasından kaynaklandığından şüpheleniyorum.Bir sözlükte lambdas depolamak

Kodu:

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

ortaya atılan hata SyntaxError: invalid syntax ve benim += doğru işaret. Kısayol operatörleri lambdalara izin vermiyor mu yoksa düşündüğümden daha uzakta mıyım?

aklı uğruna

, ben (Bu sadece küçük bir sözlük değildir.) Çok benzer çiftleri yüzlerce atladık

DÜZENLEME:

Benim konu şey atamak için çalışıyor oldu görünüyor Bir lambda ifadesi içinde. Howver, benim çözülecek meselem bu yüzden, bu sözlükteki anahtarın (kırık kodumda) tanımlanan alanı değiştirebilmeyi öğrenen bir yöntemi nasıl elde edebilirim?

Bazı durumlarda eval() yardımına başvurulur mu?

EDIT_FINAL:

functools.partial() yöntemi sorunun bu genişletilmiş kısmına tavsiye ve bunu araştıran sonra, bunun yeterli benim sorunu çözmek için bulacaksınız inanıyoruz edildi.

cevap

24

Bir ifadedeki ödevleri kullanamazsınız ve lambda yalnızca bir ifade alır.

sadece ince aksi sözlüklerde lambdas saklayabilirsiniz:

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

elbette yukarıda lambda sadece sonuç döndürür, bu yerinde target.equimentPoisonRatingBonus değiştirmez.

+0

İlginçtir, ama şimdi lambda'mı çağırmak her neyse, o alanı belirli bir sonuca eklemeyi bilmesi gerekiyor. Bunun herhangi bir yolu var mı? – BlackVegetable

+1

@BlackVegetable: Bunun yerine düzgün bir işlev kullanın veya 'target' sınıfına bir yöntem ekleyin. –

+0

Bu sözlükte bu (benzer) öğeden yaklaşık 150 tane var. Böylece, her yenilgi için uygun bir işlev kullanılarak bu sözlüğün amacı. Hmm ... – BlackVegetable

İlgili konular