我想覆盖Python默认的round()函数,因为我必须将round()函数的结果转换为整数。默认情况下,round() 返回浮点型值。 下面给出的代码返回错误消息。
运行时错误:调用 Python 对象时超出最大递归深度。
def round(number):
if type(number) is float: return int(round(number))
return None
当前代码的问题是,在覆盖内置
round()
方法后,当您在自己的 round()
内调用 round()
时,您正在递归调用自己的函数,而不是内置 round
功能。
builtins
模块来访问 round()
内置函数 -
import builtins
def round(number):
if type(number) is float: return int(builtins.round(number))
return None
__builtin__
模块 -
import __builtin__
def round(number):
if type(number) is float: return int(__builtin__.round(number))
return None
虽然我真的建议不要这样做,而是为你的回合函数使用一个新名称,也许像
round_int
之类的。
请注意,另一件事是您的代码将返回
float
类型的四舍五入数字,对于所有其他类型,它将返回 None
,我不确定这是否是有意的,但我猜您会想要返回其他类型的 number
(至少 int
?)。
正如已经指出的,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
在某些情况下,您可能希望将舍入应用于默认情况下不支持它的特定类。
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 上测试