2015-09-28 81 views
4

我想覆盖python的默认round()函数,因为我必须将round()函数的结果转换为整数。默认情况下,round()以float形式返回值。 下面给出的代码是返回错误消息。如何覆盖像round()这样的默认python函数?

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

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

为什么不直接用一个单独的名称定义一个新函数? – CoryKramer

+1

你有无限的递归,因为你正在调用你在if条件中声明的同一个round()函数 - 无限! – Ananth

+0

他在int()之前调用round(数字)...'number'将始终是原始参数传递 – Ananth

回答

14

与您当前密码的问题是,你已经覆盖后内置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?)。

+0

只接受浮点数是有意的。我想通过四舍五入将小数转换为整数。 –

+0

谢谢@anand s kumar。 –

4

正如所指出的,圆是指你的函数不是内建的功能,你已经阴影的功能和蟒蛇看起来在地方,封闭,全球范围内最后建宏依次看到它圆指的是你的函数,所以你的函数基本上一直调用自己,直到你达到递归限制。

我会避免阴影轮函数的所有,但一个更简单的方法将是一个try/except增加.5传入的数量和捕获一个类型错误:

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

*我会尽量避免阴影。那么为这些例子使用另一个名称会更加一致吗? – Wolf

+0

@Wolf,我说*我会尽量避免对圆形函数进行遮蔽,除非...... *,如果你打算这样做。提供的代码可以让OP阴影轮不需要使用内置函数。 –