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:

class Vector(object):
    def __init__(self, value):
        self.value = value

    def round(self, n):
        return [round(x, n) for x in self.value]

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

import __builtin__

def round(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__.round

def round(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 masked
        return hook(digits)

__builtin__.round = round

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