gpt4 book ai didi

python - 返回默认值

转载 作者:太空狗 更新时间:2023-10-29 18:23:26 24 4
gpt4 key购买 nike

我希望模仿允许用户指定“默认”返回值的内置函数(如 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**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 = {}

关于python - 返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com