如何覆盖像 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
我想覆盖 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