添加默认参数而不覆盖无

时间:2014-08-07 23:36:31

标签: python

我想要一个允许你设置默认返回值而不是错误的函数,如果结果为None。这给了我一个如下函数:

def get_name(default=None):
    result = get_setting('name')
    if result:
        return result
    elif default:
        return default
    else:
        raise NoNameError

但是,当默认值为IS None时,这会导致错误。我怎么写这个,以便有人可以调用get_name(default=None)并获得无回复而不是错误?

我知道我可以做一个黑客,例如:

def get_name(default=SomeSingletonObject):
    result = get_setting('name')
    if result:
        return result
    elif default is not SomeSingletonObject:
        return default
    else:
        raise NoNameError

但这只是一种糟糕的形式

1 个答案:

答案 0 :(得分:2)

这是在None完全可接受的输入中使用的常见模式:

_marker = object()

def foo(val1=_marker):
    if val1 is _marker:
        do_some_stuff()

以下是more-itertools库中更有用的示例:

def first(iterable, default=_marker):
    try:
        return next(iter(iterable))
    except StopIteration:
        if default is _marker:
            raise ValueError('first() was called on an empty iterable...')
    return default