Zach Thomas - 2 months ago 6
Python Question

# Error : Can't multiply sequence by non-int of type 'Mul'

I defined a method below that is supposed to take 5 integer/float values as input, and one list object (the

`lst`
parameter) and return only the positive solutions for
`r`
in the equation
`F`
. The formula for F should return a list where each element is multiplied/subtracted using the equation given.

I got the error
`Error : Can't multiply sequence by non-int of type 'Mul'`
mentioned above. What am I missing?

``````from sympy import *
from math import pi
class solarheating:

def circular_rr(T0,T,lst,m,Cp,Eg):

r = var('r')
F = T0+pi*r**2*Eg/(m*Cp)*lst-T
r = solve(F,r)

return r[1]

lst = [0,0.25,0.5,0.75,1.0,1.25]
a = circular_rr(20,15,lst,.24,4.2,.928)
print(a)
``````

You forgot to pass the instance of the object (or `self`) on which the code is being called to the method. Since there was no `self`, you were getting the non-int error, because T0 became `self`, `T` became `T0`, and then your `lst` was being used as `T`. Since you cannot subtract a int from a list, this produced an error.

Here's the corrected code.

``````from sympy import *
from math import pi

class solar heating:

def circular_rr(self,T0,T,lst,m,Cp,Eg):
r = var('r')
F = T0+pi*r**2*Eg/(m*Cp)*lst-T
r = solve(F,r)
return r[1]

lst = [0,0.25,0.5,0.75,1.0,1.25]
my_instance = solarheating()
a = my_instance.circular_rr(20,15,lst,.24,4.2,.928)
print(a)
``````

The reason you need to use `self` is because Python does not use the @syntax to refer to instance attributes. The method is called on the instance you pass in the `self` attribute. You don't actually write instance methods in Python; what you write is class methods which (must) take an instance as a first parameter. And therefore, youâ€™ll have to place the instance parameter somewhere explicitly.

Edit: Besides the obvious `self` error I've described above, you're multiplying a float by a list. That's what's causing the `can't multiply sequence by non-int of type 'Mul'` error.

If you want to multiply each item in the list by the float, your corrected method code will be:

``````    def circular_rr(self,T0,T,lst,m,Cp,Eg):
r = var('r')
temp_val = T0+pi*r**2*Eg/(m*Cp)
F = [x*temp_val-T for x in lst]
r = solve(F,r)
return r[1]
``````