Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用None作为关键字参数的参数_Python_Chaining - Fatal编程技术网

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行,具有相同或改进的可读性。很好的做法,在我编写答案后删除您的注释。从重复的问题复制您的答案是非常困难的。