Skip to content Skip to sidebar Skip to footer

Why Can't `round` Be Defined For Non-floats?

Given a simple class like class Vector(object): def __init__(self, value): self.value = value def __abs__(self): return math.sqrt(sum([x**2 for x in self.va

Solution 1:

The __round__ special method was only introduced in Python 3. There is no support for the special method in Python 2.

You'll have to use a dedicated method instead of the function:

classVector(object):def__init__(self, value):
        self.value = value

    defround(self, n):
        return [round(x, n) for x inself.value]

or you'd have to provide your own round() function:

import __builtin__

defround(number, digits=0):
    try:
        return number.__round__(digits)
    except AttributeError:
        return __builtin__.round(number, digits)

You could even monkey-patch this into the __builtins__ namespace:

import __builtin__

_bltin_round = __builtin__.rounddefround(number, digits=0):
    try:
        hook = number.__round__
    except AttributeError:
        return _bltin_round(number, digits)
    else:
        # Call hook outside the exception handler so an AttributeError # thrown by its implementation is not maskedreturn hook(digits)

__builtin__.round = round

Post a Comment for "Why Can't `round` Be Defined For Non-floats?"