Python 使用None作为关键字参数的参数
可能重复:Python 使用None作为关键字参数的参数,python,chaining,Python,Chaining,可能重复: 我在一个类中有一个函数: 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 =
我在一个类中有一个函数:
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()
当我这样做时会出现问题:
three = anInstanceOfMyClass.foo(3).bar().foo()
shouldBeNoneButIsThree = anInstanceOfMyClass.foo(3).foo(None).foo()
在这里,富认为我没有通过辩论。
我可以通过以下方式避免这种情况:
将值设置为某个值您需要使用sentinel来检测是否未设置默认值:
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 = {}
使用sentinel对象值是相当常见的;这就是库在中所做的:
请注意,sentinel对象应该直接在类中定义。我喜欢链接,因为它可以将300行短代码更改为100行,具有相同或改进的可读性。很好的做法,在我编写答案后删除您的注释。从重复的问题复制您的答案是非常困难的。