簡體   English   中英

Python中可選參數的默認值:

[英]Default value for optional argument in Python:

我有以下方法:

def get_data(replace_nan=False):
    if replace_nan is not False
        data[numpy.isnan(data)] = replace_nan
        return data
    else:
        return data[~numpy.isnan(data)]

因此,如果replace_nan為False,我們返回一些數據數組但刪除NaN ,如果是其他任何東西,我們用參數替換NaN

問題是,我可能想用False替換NaN 或者其他任何東西,為此。 什么是最蟒蛇的方式呢? 這個:

def get_data(**kwargs):
    if "replace_nan" in kwargs:
       ...

工作,但在語義上是丑陋的(因為我們真的只對一個關鍵字參數感興趣, replace_nan )任何建議如何處理這種情況?

通常人們使用None作為默認值,然后檢查是否為is not None

如果您還需要允許None ,請使用虛擬對象:

__default = object()
def get_data(replace_nan=__default):
    if replace_nan is __default:
        ...

numpy將數組內的False計算為0:

    >>>np.array([False,True,2,3])
    array([0, 1, 2, 3])

所以這可能不是你想要發生的事情。

    def get_data(replace_nan=False):
       if replace_nan:
          return np.where(np.isnan(data),replace_nan,data)
       else:
          return data[~numpy.isnan(data)]

numpy.where函數構建一個數組,其中包含條目為NaN的索引。 在那里它用replace_nan替換條目,在任何其他地方保留條目。

手冊頁

numpy.where(condition[, x, y])
Return elements, either from x or y, depending on condition.

我想在ThiefMaster的答案下面寫這個評論但是評論中沒有格式允許,所以...:

如果您擔心弄亂你的命名空間,你可以-一些tricks- del定義函數后的變量。

__default = object()
def get_data(replace_nan=__default, __default=__default):
  if replace_nan is __default:
    ...
del __default

要么:

__default = object()
def get_data(replace_nan=__default):
  if replace_nan is get_data.default_replace_nan:
    ...
get_data.default_replace_nan = __default
del __default

另一種避免ThiefMaster方法混亂的方法是:

def get_data(replace_nan=object()):
  if replace_nan is get_data.func_defaults[0]:
    ...

但它使用的python interna可能不那么便攜(pypy / stackles / next version / ...)。

暫無
暫無

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

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