OverflowError: Python int demasiado grande para convertir a C largo

Tengo esta clase

class MetricInt(int): """Int wrapper that adds only during the observation window.""" def __new__(cls, _, initial): return int.__new__(cls, initial) def __init__(self, sim, initial): int.__init__(initial) self.sim = sim def __add__(self, val): if self.sim.in_observe_window(): self = MetricInt(self.sim, super(MetricInt, self).__add__(int(val))) return self 

Que básicamente sobrescribe el método __add__ solo para la adición si self.sim.in_observe_window() devuelve True .

Sin embargo, si el valor inicial es demasiado grande, tengo OverflowError: Python int too large to convert to C long .

¿Cuál es la forma correcta de hacer lo que estoy tratando de hacer y también manejar grandes números?

¿Estás en Python 2.6? Usted podría intentar subclasificar long lugar.

Pero, en general, sugiero encarecidamente no subclasificar tipos incorporados de Python; CPython se reserva el derecho de omitir llamadas a métodos especiales en tales tipos, y por ejemplo no llamará a __str__ en una subclase de str . Su ejemplo aquí funciona, pero podría estar pidiendo errores.

Considere delegar en su lugar y delegar los operadores que desee. (Es posible que también desee __int__ , por supuesto).

Me gusta la respuesta de Eevee acerca de delegar. Él no ha proporcionado ningún código, así que lo estoy haciendo:

 class MetricInt(object): """Int wrapper that adds only during the observation window.""" def __init__(self, sim, initial): self.sim = sim self.val = int(initial) def __add__(self, val): if self.sim.in_observe_window(): self.val += int(val) return self def __int__(self): return self.val def __float__(self): return float(self.val) 

De esta manera, se resuelve el problema. Cuando decidí subclasificar el tipo int , fue porque ya tenía algunas variables int en mi código y no quería cambiar mi código demasiado. Sin embargo, si defino __int__ y __float__ , solo necesito agregar algunos lanzamientos a int . No es tan malo, supongo que si evita errores extraños.

Resolví un problema similar al convertirlo en int con int (bigNumber), pero creo que es trivial en tu caso. Puedes probar con el numpy:

 numpy.int32(Your big number) 

Y estos que encontré en algún lugar que ahora no puedo recordar:

 def int_overflow(val): if not -sys.maxint-1 <= val <= sys.maxint: val = (val + (sys.maxint + 1)) % (2 * (sys.maxint + 1)) - sys.maxint - 1 return val 

Créditos al autor.

Puede pasar el valor desbordado a través de esta función y normalizarlo.

Atentamente