Python中可选参数的默认值:

时间:2012-05-15 11:00:01

标签: arguments 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 s,如果是其他任何内容,我们会将NaN替换为参数。

问题是,我可能希望将NaN替换为False。或者其他任何东西,为此。什么是最蟒蛇的方式呢?这样:

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

有效,但在语义上很难看(因为我们真的只对一个关键字参数感兴趣,replace_nan)有关如何处理这种情况的任何建议吗?

4 个答案:

答案 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 / ...)。