当前位置: 首页 > 面试题库 >

python-返回默认值

洪富
2023-03-14
问题内容

我希望模仿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 = {}


 类似资料:
  • 我正在尝试在Spring中使用MessageSource注入文本消息。我编写的程序编译良好,但它总是打印出默认消息,而不是从. Properties文件中获取正确的值。我一点线索也没有。 下面是尝试注入文本的Circle类: 下面是bean配置文件的一部分: 我存储问候语和画图。圈入消息。属性文件,并编写了一个主类。但输出总是: 有人知道我的情况可能会出什么问题吗? 更新感谢您的建议。我正在调试,

  • 我有一个托管在openShift上的wordpress应用程序,使用php-5.4墨盒部署。到今天为止,它再次使用php-5.3二进制文件,这会引发很多错误。我已经重新启动了应用程序以及php墨盒,仍然是相同的错误。我该如何修复这个问题? 哪个php /usr/bin/php php -v PHP警告:PHP启动:无法加载动态库'/usr/lib 64/PHP/modules/LDAP . so

  • 问题内容: 我有一个查询,可以获取在某个日期范围内所有在线用户。由于我要如何显示数据,这是通过IN查询完成的。但是,如果找不到解析为IN条件的ID的记录,我想返回一个默认值。 简化查询: 现在,上面的查询将仅按预期拉入那些符合条件的行。我还希望查询为不符合条件的IN条件中的ID提取默认值。 在这种情况下使用将不起作用,因为永远不会返回记录 仅供参考-我正在将此查询解析为自定义PDO函数。我没有使用

  • 默认回复 设置默认回复快捷键 后台回复素材设置-发消息-回复消息

  • 问题内容: 是否有可能为集合中未找到的所有键返回默认值? 问题答案: [更新] 正如其他答案和评论者所指出的那样,从Java 8开始,您可以简单地调用。 [原版的] 没有Map实现可以完全做到这一点,但是通过扩展HashMap来实现自己的实现很简单:

  • 问题内容: 我有以下选择语句,以获取流的下一个预定项目。如果没有匹配的行,我希望它返回默认值。这是我正在使用的行: 那应该可以获取最近计划的项目,但如果它早于查询之前30分钟,则不会。但是,如果用户未安排任何时间,则我需要一个默认值,以便流中实际播放某些内容。我尝试了以下方法: 和: 但是,如果未找到任何行,它将始终返回空结果。我该如何返回默认值? 问题答案: 一种方法 由于只返回一行,因此可以使