Storing lambdas in a dictionary

34,254

You cannot use assignments in a expression, and a lambda only takes an expression.

You can store lambdas in dictionaries just fine otherwise:

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

The above lambda of course only returns the result, it won't alter target.equimentPoisonRatingBonus in-place.

Share:
34,254
BlackVegetable
Author by

BlackVegetable

I am a Software Engineer proficient with backend tasks and DevOps buzzwords. I am particularly experienced with: Python, C, Java, JavaScript and some Bash. I would love to have an excuse to learn Clojure or to further develop my Go skills. Please don't ever make me look at PHP though. Specialties and Interests within Software Engineering include DevOps (Internal Tools, Automation, Monitoring, Oncall, CI/CD, etc.) Functional Programming, Distributed Systems and Performance Tuning. Contact: [email protected]

Updated on January 20, 2020

Comments

  • BlackVegetable
    BlackVegetable over 4 years

    I have been trying to create a dictionary with a string for each key and a lambda function for each value. I am not sure where I am going wrong but I suspect it is either my attempt to store a lambda in a dictionary in the first place, or the fact that my lambda is using a shortcut operator.

    Code:

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

    The error being raised is SyntaxError: invalid syntax and pointing right at my +=. Are shortcut operators not allowed in lambdas, or am I even farther off track than I thought?

    For the sake of sanity, I have omitted hundreds of very similar pairs (It isn't just a tiny dictionary.)

    EDIT:

    It seems my issue was with trying to assign anything within a lambda expression. Howver, my issue to solve is thus how can I get a method that only knows the key to this dictionary to be able to alter that field defined in my (broken) code?

    Would some manner of call to eval() help?

    EDIT_FINAL:

    The functools.partial() method was recommended to this extended part of the question, and I believe after researching it, I will find it sufficient to solve my problem.