[英]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.