Search code examples
evalpython-3.2

eval(): can't assign to function call


Yet another question for my cookie clicker... Here is the code I made that produces an error:

cps=cps+bcps[buych]
c=c-bprice[buych]
eval(buych)=eval(buych)+1

cps is a variable,
c is a variable,
b1,b2,b3,b4,b5 are variables
buych is a string (Which I get from an input() command)
bcps and bprice are maps (shown below)

bcps = {"b1":'1',
    "b2":'5',
    "b3":'10',
    "b4":'20',
    "b5":'25'}
bprice = {"b1":'10',
    "b2":'20',
    "b3":'30',
    "b4":'40',
    "b5":'50'}

So, what I'm trying to achieve is:
-Take the input string value, which will be 'b1','b2', 'b3', 'b4', 'b5'
-Increase cps buy it's value within bcps
-Decrease c by it's value within bprice
-Use eval to convert the 'b#' to b#
-Increase b# by 1

When running the script, I do not get error text in the python shell. Instead, I get a pop-up that says "Can't assign to function call". The error is highlighted as the first white space before the eval(). I really don't get this, as I have no functions within the error.

Thanks for reading,
Cookie Monster


Solution

  • eval(buych) is a function call -- you're calling the function eval(). You can only assign to variables, you can't assign to the result of a function.

    You need to concatenate the variable into a valid assignment expression, and exec that:

    exec(buych + '=' + buych + '+1')
    

    eval is for evaluating expressions, you have to use exec to execute a whole statement.

    But if you find yourself needing to do this, you're usually doing something wrong. Instead of computing variable names and expressions, you should use lists or dicts so you can refer to them using an index or key.