如何覆盖默认的python函数,如round()?

kqlmhetl  于 4个月前  发布在  Python
关注(0)|答案(3)|浏览(64)

我想覆盖python的默认round()函数,因为我必须将round()函数的结果转换为整数。默认情况下,round()返回浮点值。下面给出的代码返回错误消息。

RuntimeError:调用Python对象时超过最大递归深度。

def round(number):
     if type(number) is float: return int(round(number))
     return None

字符串

sshcrbum

sshcrbum1#

当前代码的问题是,在覆盖了内置的round()方法之后,当您在自己的round()中调用round()时,您是在递归地调用自己的函数,而不是内置的round函数。
对于Python 3.x,您可以使用builtins模块访问round()内置函数-

import builtins
def round(number):
    if type(number) is float: return int(builtins.round(number))
    return None

字符串
对于Python 2.x,它将是__builtin__模块-

import __builtin__
def round(number):
    if type(number) is float: return int(__builtin__.round(number))
    return None


虽然我真的建议不要这样做,而是为你的round函数使用一个新的名称,也许像round_int之类的。
请注意,另一件事是,您的代码将返回float类型的四舍五入数,对于所有其他类型,它将返回None,我不确定这是否是故意的,但我猜您会希望返回其他类型的number(至少int?)。

wlzqhblo

wlzqhblo2#

正如已经指出的,round引用你的函数而不是内置函数,因为你已经隐藏了函数,并且python按照 local,enclosing,global scope 和最后 builtins 的顺序查看round引用你的函数,所以你的函数本质上一直在调用自己,直到你达到递归限制。
我会避免隐藏round函数,但一个更简单的方法是try/except向传入的数字添加.5并捕获TypeError:

def round(number):
    try:
        return int(number + .5)
    except TypeError:
        return None

字符串
如果你要检查类型,你应该使用issinstance,你可以合并它与numbers.Number检查任何数字类型:

from numbers import Number
def round(number):
    if isinstance(number, Number):
        return int(number+.5)
    return None


如果你只是想检查float类型:

def round(number):
    if isinstance(number, float):
        return int(number+.5)
    return None

zqry0prt

zqry0prt3#

在某些情况下,您可能希望将round应用于默认情况下不支持它的特定类。

class Point:
    def __init__(self, x, y):
        self.x=x
        self.y=y

    def __round__(self, precision):
        if precision <= 0:
            self.x = int(self.x)
            self.y = int(self.y)
        else:
            self.x = round(self.x, precision)
            self.y = round(self.y, precision)
        # do whatever
        return self

字符串
当在类中定义时,__round__方法将重载内置的round
在Python 3.10上测试。

相关问题