簡體   English   中英

如何覆蓋默認的python函數,如round()?

[英]How to override default python functions like round()?

我想覆蓋python的默認round()函數,因為我必須將round()函數的結果轉換為整數。 默認情況下,round()返回float中的值。 下面給出的代碼是返回錯誤消息。

RuntimeError:調用Python對象時超出了最大遞歸深度。

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

與您現有的代碼的問題是,你已經覆蓋后的內置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為其他類型(ATLEAST int ?)。

正如已經指出的那樣,round指的是你的函數不是內置函數,因為你已經遮蔽了函數,而python看起來在本地,封閉,全局范圍內 ,最后內置的那個順序它看到圓形指的是你的函數所以你的函數本質上一直調用自己,直到你達到遞歸限制。

我會避免陰影圓函數,但更簡單的方法是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM