Why can't `round` be defined for non-floats?

后端 未结 1 1259
被撕碎了的回忆
被撕碎了的回忆 2020-12-21 13:23

Given a simple class like

class Vector(object):
    def __init__(self, value):
        self.value = value
    def __abs__(self):
        return math.sqrt(sum         


        
相关标签:
1条回答
  • 2020-12-21 14:06

    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
    
    0 讨论(0)
提交回复
热议问题