None 的默认参数替代?

Default argument alternative to None?

我写的函数有点像这样:

def parse(string, default=None):
    try:
        ...  # Body of function here
    except ParseError:
        if default is not None:
            return default
        raise

但是如果我真的想要 return None.

,我 运行 就会遇到问题
if len(sys.argv) > 4:
    if flag.ignore_invalid:
        result = parse(sys.argv[4], None)  # Still raises error
    else:
        result = parse(sys.argv[4])

我尝试解决的问题是:

_DEFAULT = object()

def parse(string, default=_DEFAULT):
    ...
        if default is not _DEFAULT:
            ...

但这似乎是我想多了,而且似乎有更简单的方法。

anyall 函数可以做到这一点(默认允许 None),但我不知道怎么做。

使用关键字参数怎么样,然后你可以检查用户是否传递了任何东西:

def parse(string, **kw):
    try:
        ...  # Body of function here
    except ParseError:
        if 'default' in kw:
            return kw['default']
        raise

缺点是,如果有人拼错,你将无法理解 default

除非你经常需要忽略 ParseError,否则我会让 parse 一直抛出,并且只在我需要的地方捕获它:

try:
    parse(sys.argv[4])
except ParseError:
    if not flag.ignore_invalid:
        raise

虽然如果你必须有一个默认值,那么 _DEFAULT 解决方案就可以了。