python - 返回默认值

2023-12-28

我正在寻找模仿内置函数的行为(例如getattr)允许用户指定“默认”返回值。我最初的尝试是这样做

def myfunc(foo, default=None):
    # do stuff
    if (default is not None):
        return default
    raise SomeException()

问题是如果用户想要None作为它们的返回值,该函数将引发异常。第二次尝试:

def myfunc(foo, **kwargs):
    # do stuff
    if ('default' in kwargs):
        return kwargs['default']
    raise SomeException()

这解决了上述问题并允许用户指定任意值,但引入了一个烦恼,因为用户必须始终指定default=bar在他们的函数调用中;他们不能仅仅提供bar在最后。同样地,*args可以使用,但阻止用户使用default=bar如果他们更喜欢这种语法。

组合*args and **kwargs提供了一个可行的解决方案,但感觉这需要付出很大的努力。它还可能掩盖不正确的函数调用(例如bar = myfunc(foo, baz, default=qux))

def myfunc(foo, *args, **kwargs):
    # do stuff
    if (len(args) == 1):
        return args[0]
    if ('default' in kwargs):
        return kwargs['default']
    raise SomeException()

有更简单的解决方案吗? (Python 3.2,如果有的话)


您需要使用哨兵来检测是否未设置默认值:

sentinel = object()

def func(someparam, default=sentinel):
    if default is not sentinel:
        print("You passed in something else!")

这是有效的,因为一个实例object()总是有它自己的内存ID,因此is仅当精确值保持不变时才会返回 True。任何其他值不会注册为同一个对象,包括None.

您将在各种不同的 python 项目中看到上述技巧的不同变体。以下任何哨兵也可以工作:

sentinel = []
sentinel = {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python - 返回默认值 的相关文章

随机推荐