当前位置: 首页 > 知识库问答 >
问题:

如何在Python中创建虚假的哨兵对象?

缑泓
2023-03-14

我有一个函数,它被设计为通过传入一个to关键字参数来调用。我使用哨兵对象作为默认值,这样我就可以确保没有人只是在没有任何参数的情况下调用func(),这是一个明显的逻辑错误。通过传递作为其中一个参数的值来调用函数是可以的,在这种情况下它只是不做任何处理。

NO_VALUE = object()


def func(*, arg1 = NO_VALUE, arg2 = NO_VALUE):
    if arg1 is NO_VALUE and arg2 is NO_VALUE:
        raise ValueError("Pass in one of `arg1` or arg2`.")

    if arg1 is not NO_VALUE and arg1:
        # Do something with a truthy `arg1` value.
    if arg2 is not NO_VALUE and arg2:
        # Do something with a truthy `arg2` value.

如果arg1不是NO_ VALUE,arg1和arg2不是NO_VALUE,arg2和arg2,我可以简化<code>分别为<code>和<code>的<code>吗?

我尝试使NO_VALUE成为空元组(),但似乎空元组的id()总是(?)与任何其他空元组的id()相同。我也不想让NO_VALUE例如空列表对象,从那时起,我会收到有关使用可变默认值的linter警告。

共有2个答案

松骏俊
2023-03-14

为了获得您描述的行为,我认为您应该使用kwargs而不是关键字args。考虑以下功能:


def func(**kwargs):
    if kwargs.keys() == set(['arg1']):
        print(kwargs['arg1'])
    elif kwargs.keys() == set(['arg2']):
        print(kwargs['arg2'])
    else:
        raise ValueError("Pass in one of `arg1` or `arg2`")

因为你最终试图在你的函数参数上实现更复杂的逻辑,所以用代码来处理这个问题是有意义的,而不是让编译器尝试用奇怪的哨兵来整理它。

刘意
2023-03-14

在任何情况下:对于Python对象是“Falsy”,它可以是实现__bool__并在调用时返回False的类的实例

class FalsySentinel:
    def  __bool__(self):
        return False


NO_VALUE = FalsySentinel()


def func(*, arg1 = NO_VALUE, arg2 = NO_VALUE):
    if arg1 is NO_VALUE and arg2 is NO_VALUE:
        raise ValueError("Pass in one of `arg1` or arg2`.")

    if arg1:
        # Do something with a truthy `arg1` value.
    if arg2:
        # Do something with a truthy `arg2` value.

还有其他方法可以生成falsy对象,比如实现< code>__len__并返回< code>0的对象——但这是最直接明了的方法。

 类似资料:
  • 主要内容:一、哨兵,二、源码分析,三、总结一、哨兵 Sentinel(哨兵),听名字大家都应该想得到这个家伙是做什么的。在redis的应用中,有单机模式、主从模式、哨兵模式和集群模式,其实你从它的发展就可以看出来,redis是从一个简单的应用开始,不断的壮大,从单点到分布式,从简单的主从备份以及初始的哨兵监控,再到可以看成把二者合成的集群模式,除了是应用场景的变化,更多的是为了提高安全性和高可用性。网上有很多人问哨兵和集群有啥不一样,其实

  • 问题内容: 我想用Python创建一个虚拟磁盘。我希望能够以跨平台的方式执行此操作,因此它可以在Windows XP至7,Mac和Linux上运行。我希望能够像普通驱动器一样对ramdisk进行读/写操作,最好使用驱动器号/路径。 我想要这样做的原因是为创建具有特定结构的目录的脚本编写测试。我想在ramdisk中完全创建目录,以便确保测试结束后将其完全删除。我考虑使用Python的,但是如果测试将

  • 我有一个redis哨兵配置,有一个主,两个从和3个哨兵运行。我注意到,在某个时候,哨兵可能会更换主人,选择一个奴隶作为主人。这给作为独立客户机连接到主节点的应用程序带来了问题(我正在修改代码以使用哨兵)。我想知道是否可以通过连接到sentinel客户机来切换主服务器,即通过'' 有人能让我知道是否有一个命令,我可以用来切换主IP吗?

  • Redis 哨兵(Sentinel)是 Redis 的高可用性(Hight Availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 Sentinel

  • 本文向大家介绍如何在Python中创建类对象?,包括了如何在Python中创建类对象?的使用技巧和注意事项,需要的朋友参考一下 使用该类的构造函数创建一个类对象。然后将该对象称为类的实例。类实例化使用函数表示法。  在下面的代码中,我们定义一个类并创建了相同类的实例,如下所示

  • 我正在与一个远程合作伙伴开发一个Laravel项目。 我没有安装mcrypt,所以每次需要使用composer时,我都会通过别名引用php: 这是一个很好的修复,直到我的远程朋友安装了哨兵软件包,这是我无法做到的。 使用另一个stackoverflow线程,我能够使用mcrpyt引用正确版本的php,更新composer并安装sentry。 我的问题是: Sentry在我搭档的本地主机上工作,我将