我想覆盖python的默认round()函数,因为我必须将round()函数的结果转换为整数。默认情况下,round()返回浮点值。下面给出的代码返回错误消息。
RuntimeError:调用Python对象时超过最大递归深度。
def round(number):
if type(number) is float: return int(round(number))
return None
字符串
我想覆盖python的默认round()函数,因为我必须将round()函数的结果转换为整数。默认情况下,round()返回浮点值。下面给出的代码返回错误消息。
RuntimeError:调用Python对象时超过最大递归深度。
def round(number):
if type(number) is float: return int(round(number))
return None
字符串
3条答案
按热度按时间sshcrbum1#
当前代码的问题是,在覆盖了内置的
round()
方法之后,当您在自己的round()
中调用round()
时,您是在递归地调用自己的函数,而不是内置的round
函数。对于Python 3.x,您可以使用
builtins
模块访问round()
内置函数-字符串
对于Python 2.x,它将是
__builtin__
模块-型
虽然我真的建议不要这样做,而是为你的round函数使用一个新的名称,也许像
round_int
之类的。请注意,另一件事是,您的代码将返回
float
类型的四舍五入数,对于所有其他类型,它将返回None
,我不确定这是否是故意的,但我猜您会希望返回其他类型的number
(至少int
?)。wlzqhblo2#
正如已经指出的,round引用你的函数而不是内置函数,因为你已经隐藏了函数,并且python按照 local,enclosing,global scope 和最后 builtins 的顺序查看round引用你的函数,所以你的函数本质上一直在调用自己,直到你达到递归限制。
我会避免隐藏round函数,但一个更简单的方法是
try/except
向传入的数字添加.5并捕获TypeError:字符串
如果你要检查类型,你应该使用
issinstance
,你可以合并它与numbers.Number
检查任何数字类型:型
如果你只是想检查float类型:
型
zqry0prt3#
在某些情况下,您可能希望将
round
应用于默认情况下不支持它的特定类。字符串
当在类中定义时,
__round__
方法将重载内置的round
。在Python 3.10上测试。