3

可能重复:
python - 返回默认值

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

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. 在构造函数中创建一个对象实例,其值为默认值

两者都似乎有点太多的工作,有什么更简单的方法?

为某事设定价值

4

2 回答 2

7

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

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 = {}
于 2012-11-08T11:13:04.470 回答
2

使用哨兵对象值是相当普遍的;这就是图书馆所做的abcoll.py

   __marker = object()

   def pop(self, key, default=__marker):
       ...
       if default is self.__marker:

请注意,哨兵对象应直接在类中定义。

于 2012-11-08T11:14:45.787 回答