python - 使用 None 作为关键字参数的参数

标签 python chaining

<分区>

Possible Duplicate:
python - returning a default value

我在一个类中有一个函数:

def foo(self, value = None):
    if value is None:
        return self.value
    self.value = value
    return self

这是一个 getter 和 setter 合二为一的方法,优点是我可以像这样链接函数:

three = anInstanceOfMyClass.foo(3).bar().foo()

当我这样做时出现问题:

shouldBeNoneButIsThree = anInstanceOfMyClass.foo(3).foo(None).foo()

这里foo认为我没有通过参数。 我可以通过以下方式避免这种情况:

  1. 将值设置为一些奇怪的对象,比如随机字符串
  2. 在构造函数中创建一个对象实例,其值为默认值

两者似乎都太麻烦了,有什么更简单的方法吗?

为某物设定值(value)

最佳答案

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

sentinel = object()

def foo(self, value=sentinel):
    if value is not sentinel:
        print("You passed in something else!")

这是有效的,因为 object() 的实例将始终拥有自己的内存 ID,因此 is 仅在保留确切值的情况下才返回 True。 任何其他值 都不会注册为同一对象,包括None

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

sentinel = []
sentinel = {}

关于python - 使用 None 作为关键字参数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287887/

相关文章:

python - datetime.now(tz) 和 datetime(year,month,day,tzinfo=tz) 没有相同的 UTC 偏移量

javascript - 我如何使用 bluebirdjs 顺序链接 promise ?

python - Ray:如何在一个 GPU 上运行多个 actor?

python - 如何在html中使用form标签的action属性?

java - Java 中的构造函数链和可见性

java - 在 Java 8 中使用先前链接的 thenCompose lambda 的值

javascript - 链接自定义 javascript 函数

smartcard - T=1 时回复智能卡中的区 block 链

Python 2.7.9 带有列表奇怪输出的打印语句

python - 如何使用 celery 安排在月底运行的任务?