Python中可选参数的默认值:

3
我有以下方法:

我有以下方法:

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。 或者其他任何东西。有什么最pythonic的方法吗?这个:
def get_data(**kwargs):
    if "replace_nan" in kwargs:
       ...

这个方法虽然可行,但语义不太美观(因为我们只关心一个关键字参数replace_nan)。你有什么好的建议来处理这种情况吗?

4个回答

4
通常人们将None作为默认值,然后检查is not None
如果您也需要允许None,请使用一个虚拟对象:
__default = object()
def get_data(replace_nan=__default):
    if replace_nan is __default:
        ...

我已经使用了 False,因为 None 经常用于替换缺失值。但是虚拟默认对象很好,谢谢! - Manuel Ebert

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替换条目,并保留其他地方的条目。从手册页面中可以了解更多信息。
numpy.where(condition[, x, y])
Return elements, either from x or y, depending on condition.

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

有趣!然而我一直认为 __... 是用来混淆的;-) - Manuel Ebert
传统上,在C语言中,__是为编译器内部使用而保留的,因此应用程序构建者不应使用它。在Python中情况有些不同。无论如何:混乱是一个问题。您不能在下一个可能有用的情况下使用名称__default,因为您会覆盖第一次使用的__default(并在此过程中破坏代码)。因此,应避免混乱,即使__可以使混乱变得明显。 - Alfe

1
另一种避免ThiefMaster方法混乱的方式是这样的:
def get_data(replace_nan=object()):
  if replace_nan is get_data.func_defaults[0]:
    ...

但它使用Python内部机制,可能不太可移植(pypy/stackles/下一个版本/...)。


з”ҡиҮіеҸҜд»Ҙе°ҶдёҠйқўд»Јз Ғдёӯзҡ„0жӣҝжҚўдёәget_data.func_code.co_varnames.index('replace_nan')пјҢд»ҘйҳІжӯўеҗҺз»ӯдҝ®ж”№get_data()зӯҫеҗҚж—¶еҮәзҺ°й—®йўҳгҖӮдҪҶжҲ‘жғіжҲ‘们зҺ°еңЁеҸҜиғҪжңүзӮ№иҝҮеәҰи®ҫи®ЎдәҶгҖӮ - Alfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接