如何覆盖像 round() 这样的默认 python 函数?

How to override default python functions like round()?

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

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

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

您当前代码的问题是,在您覆盖内置 round() 方法后,当您在自己的 round() 中调用 round() 时,您正在递归调用您的自己的功能,而不是内置的 round 功能。

对于Python3.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 左右。

请注意,另一件事是您的代码将 return float 类型的舍入数字,对于所有其他类型,它将 return None ,我我不确定这是否是有意的,但我猜你想 return 支持其他类型的 number(至少 int?)。

正如已经指出的那样,round 指的是你的函数而不是内置函数,因为你已经隐藏了函数并且 python 在 局部,封闭,全局范围内查找 最后是 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

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

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