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

问题描述 投票:0回答:3

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

运行时错误:调用 Python 对象时超出最大递归深度。

def round(number):
     if type(number) is float: return int(round(number))
     return None
python python-3.x python-2.x
3个回答
19
投票

当前代码的问题是,在覆盖内置

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_int
之类的。

请注意,另一件事是您的代码将返回

float
类型的四舍五入数字,对于所有其他类型,它将返回
None
,我不确定这是否是有意的,但我猜您会想要返回其他类型的
number
(至少
int
?)。


4
投票

正如已经指出的,round 指的是你的函数而不是内置函数,因为你已经隐藏了该函数,并且当 python 在 local, enclosure, global 范围 中查找,最后 builtins 按顺序它看到 round 指的是你的函数,因此您的函数本质上会不断调用自身,直到达到递归限制。

我会完全避免隐藏 round 函数,但更简单的方法是

try/except
在传入的数字上添加 0.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

如果您只想检查浮动类型:

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

0
投票

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

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。

在 3.10 上测试

© www.soinside.com 2019 - 2024. All rights reserved.