usuario - introducir valores python
Suma de Python() y valores no enteros (5)
Es posible que también deba implementar la función __radd__
, que representa "adición inversa" y se llama cuando los argumentos no pueden resolverse en la dirección "hacia adelante". Por ejemplo, x + y
se evalúa como x.__add__(y)
si es posible, pero si eso no existe, Python intenta y.__radd__(x)
.
Dado que la función sum()
comienza con el entero 0
, lo primero que hace es intentar evaluar:
0 + Foo(3)
lo cual requerirá que implementes Foo.__radd__
.
¿Existe una forma sencilla y rápida de usar sum () con valores no enteros?
Así que puedo usarlo así:
class Foo(object):
def __init__(self,bar)
self.bar=bar
mylist=[Foo(3),Foo(34),Foo(63),200]
result=sum(mylist) # result should be 300
Intenté sobrescribir __add__
y __int__
, etc., pero aún no he encontrado una solución.
EDITAR:
La solución es implementar:
def __radd__(self, other):
return other + self.bar
Como Will sugirió en su post. Pero como siempre, todos los caminos llevan a Roma, pero creo que esta es la mejor solución ya que no necesito __add__
en mi clase
Es un poco complicado: la función sum () toma el inicio y lo agrega al siguiente, y así sucesivamente.
Necesitas implementar el método __radd__
:
class T:
def __init__(self,x):
self.x = x
def __radd__(self, other):
return other + self.x
test = (T(1),T(2),T(3),200)
print sum(test)
Intente usar el método __int__
y luego __int__
cada elemento de su lista a la función int
para obtener los valores:
class Foo(object):
def __init__(self,bar):
self.bar = bar
def __int__(self):
return self.bar
mylist = [Foo(3),Foo(34),Foo(63),200]
result = sum(map(int,mylist))
print(result)
O si no quieres importar nada,
result = reduce((lambda x,y:x+y), mylist)
Otra pequeña ventaja es que no tiene que declarar necesariamente un método __add__
como parte de sus objetos Foo, si esta es la única circunstancia en la que desearía hacer una adición. (Pero probablemente no estaría mal definir a __add__
para la flexibilidad futura).
Tratar:
import operator
result=reduce(operator.add, mylist)
sum () funciona probablemente más rápido, pero está especializado solo para números incorporados. Por supuesto, todavía tiene que proporcionar un método para agregar sus objetos Foo (). Así que el ejemplo completo:
class Foo(object):
def __init__(self, i): self.i = i
def __add__(self, other):
if isinstance(other, int):
return Foo(self.i + other)
return Foo(self.i + other.i)
def __radd__(self, other):
return self.__add__(other)
import operator
mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)]
print reduce(operator.add, mylist).i