我有以下方法:
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
s,如果是其他任何内容,我们会将NaN
替换为参数。
问题是,我可能希望将NaN
替换为False
。或者其他任何东西,为此。什么是最蟒蛇的方式呢?这样:
def get_data(**kwargs):
if "replace_nan" in kwargs:
...
有效,但在语义上很难看(因为我们真的只对一个关键字参数感兴趣,replace_nan
)有关如何处理这种情况的任何建议吗?
答案 0 :(得分:4)
通常人们使用None
作为默认值,然后检查is not None
。
如果您还需要允许None
,请使用虚拟对象:
__default = object()
def get_data(replace_nan=__default):
if replace_nan is __default:
...
答案 1 :(得分:2)
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替换条目,在任何其他地方保留条目。
来自manual page:
numpy.where(condition[, x, y])
Return elements, either from x or y, depending on condition.
答案 2 :(得分:1)
我想在ThiefMaster的回答下面写这个评论但是评论中没有格式允许,所以......:
如果您担心命名空间混乱,可以在定义函数后使用一些技巧 - 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
答案 3 :(得分:1)
另一种避免混淆ThiefMaster方法的方法是:
def get_data(replace_nan=object()):
if replace_nan is get_data.func_defaults[0]:
...
但它使用的python interna可能不那么便携(pypy / stackles / next version / ...)。