Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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`\uuuu setstate`会接受`None`作为参数?_Python_Serialization_Pickle - Fatal编程技术网

为什么python`\uuuu setstate`会接受`None`作为参数?

为什么python`\uuuu setstate`会接受`None`作为参数?,python,serialization,pickle,Python,Serialization,Pickle,我浏览了一些源代码,在serge.serialize中发现了一些我无法理解的东西: def __setstate__(self, state=None): """Initialize the object to the given state for unpickling""" self.initial_properties = Bag() # # Initialize first from the defaults and the

我浏览了一些源代码,在
serge.serialize
中发现了一些我无法理解的东西:

def __setstate__(self, state=None):
        """Initialize the object to the given state for unpickling"""
        self.initial_properties = Bag()
        #
        # Initialize first from the defaults and then from the live state
        for this_state in (self.__class__._getProperties(), state):
            if this_state:
                for name, value in this_state:
                    setattr(self, name, value)
                    setattr(self.initial_properties, name, value)

此方法是从可序列化的
对象中检索的。我感到困惑的是,为什么
\uuu setstate\uuu
中的
state
参数的默认值为
None
。如果类完全依赖于
\uu getstate\uuuu
/
\uuu setstate\uuu
进行酸洗,那么在什么情况下,状态为什么不发送到
\uuu setstate\uuuu

正如上面的文档所解释的:

取消勾选时,如果类定义了
\uuuuuuSetState\uuuuuuuuuuuuuuuuuuuuuuuuu()
,则在取消勾选时不会调用该类的未勾选状态…如果
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu getstate()
返回一个假值,则在取消勾选

因此,如果您的
\uuuu getstate\uuuu
返回
None
,它将不会在
\uuu setstate\uuuu
时间返回给您;你就是不会被打电话

但是,请注意,在中,对于经典类而言,情况并非如此。对于一个经典类,“如果一个类同时定义了
\uuu getstate\uuuuuuuuu()
\uuuu setstate\uuuuuuuuuu()
,那么state对象不必是字典,这些方法可以做它们想做的事情。”(事实上,我相信在某些情况下,任何错误的值都会变成
{}
,这并没有很好的文档记录,但是相同的
if
语句处理这个问题…)

不过,这并不能解释为什么需要一个默认值……如果您可以获得
None
,当然,您需要编写处理
None
的代码……但您不需要编写根本没有参数的代码,对吗

但是,你这样做是有原因的

首先,请注意,这个特定类的
\uuuu setstate\uuuu
比平常做得更多:它“先从默认值初始化,然后从活动状态初始化”。因此,单元测试从默认值初始化是否有效可能非常有用

最重要的是,如果您定义了一个自定义方法和unreducer,那么它就没有理由必须遵循与默认unreducer完全相同的规则。当然,它根本没有理由调用
\uuuu setstate\uuuu
,但如果您正在构建一个希望用户子类化的基类,使未减缩器尽可能像默认值一样工作,因此,您的用户只需覆盖
\uuuuu setstate\uuuuu
即可,而无需添加自己的整个
\uuuuuu reduce\uuuuu
实现

类似地,如果您要在
pickle
/
copyreg
之上构建自己的序列化程序,而不是按原样使用它,那么您的代码不必使用与
pickle
完全相同的规则。同样,它也没有理由使用类似的规则,但这样做可能会让用户更容易扩展类


我不知道这些是否适用于
serge
,但它们都可以很容易地应用于您可能想要构建的各种类型。

如果您的类完全依赖于
\uuu getstate\uuuu
/
\uu setstate\uuu
进行酸洗,那么这是没有用的

正如上面的文档所解释的:

取消勾选时,如果类定义了
\uuuuuuSetState\uuuuuuuuuuuuuuuuuuuuuuuuu()
,则在取消勾选时不会调用该类的未勾选状态…如果
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu getstate()
返回一个假值,则在取消勾选

因此,如果您的
\uuuu getstate\uuuu
返回
None
,它将不会在
\uuu setstate\uuuu
时间返回给您;你就是不会被打电话

但是,请注意,在中,对于经典类而言,情况并非如此。对于一个经典类,“如果一个类同时定义了
\uuu getstate\uuuuuuuuu()
\uuuu setstate\uuuuuuuuuu()
,那么state对象不必是字典,这些方法可以做它们想做的事情。”(事实上,我相信在某些情况下,任何错误的值都会变成
{}
,这并没有很好的文档记录,但是相同的
if
语句处理这个问题…)

不过,这并不能解释为什么需要一个默认值……如果您可以获得
None
,当然,您需要编写处理
None
的代码……但您不需要编写根本没有参数的代码,对吗

但是,你这样做是有原因的

首先,请注意,这个特定类的
\uuuu setstate\uuuu
比平常做得更多:它“先从默认值初始化,然后从活动状态初始化”。因此,单元测试从默认值初始化是否有效可能非常有用

最重要的是,如果您定义了一个自定义方法和unreducer,那么它就没有理由必须遵循与默认unreducer完全相同的规则。当然,它根本没有理由调用
\uuuu setstate\uuuu
,但如果您正在构建一个希望用户子类化的基类,使未减缩器尽可能像默认值一样工作,因此,您的用户只需覆盖
\uuuuu setstate\uuuuu
即可,而无需添加自己的整个
\uuuuuu reduce\uuuuu
实现

类似地,如果您要在
pickle
/
copyreg
之上构建自己的序列化程序,而不是按原样使用它,那么您的代码不必使用与
pickle
完全相同的规则。同样,它也没有理由使用类似的规则,但这样做可能会让用户更容易扩展类


我不知道这些是否适用于
serge
,但它们都可以很容易地应用于您可能想要构建的各种类型。

奇妙的答案,正是我想要的。非常感谢@user3002473:请务必阅读经典类的编辑版本,这一点我一开始已经忘记了……啊,这解释了很多,因为如果我不知道的话