Python 什么';这是腌菜机中“reduce”的确切用法

Python 什么';这是腌菜机中“reduce”的确切用法,python,pickle,Python,Pickle,我知道,为了可拾取,类必须覆盖\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法,并且必须返回字符串或元组 这个函数是如何工作的? 的确切用法是什么?它什么时候会被使用?我看看能不能试着解释一下这个 无论何时尝试pickle对象,都会有一些属性无法很好地序列化。例如,一个打开的文件句柄在这种情况下,pickle将不知道如何处理该对象,并将抛出一个错误 您可以告诉pickle模块如何直接在类中本地处理这些类型的对象。让我们构建一个

我知道,为了可拾取,类必须覆盖
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,并且必须返回字符串或元组

这个函数是如何工作的?
的确切用法是什么?它什么时候会被使用?

我看看能不能试着解释一下这个

无论何时尝试pickle对象,都会有一些属性无法很好地序列化。例如,一个打开的文件句柄在这种情况下,pickle将不知道如何处理该对象,并将抛出一个错误

您可以告诉pickle模块如何直接在类中本地处理这些类型的对象。让我们构建一个具有单个属性的对象的示例;打开的文件句柄:

import pickle

class test(object):
    def __init__(self, file_path = 'test1234567890.txt'):
        self.some_file_i_have_opened = open(file_path, 'wb')  # An open file in write mode.

my_test = test()
# Now, watch what happens when we try to pickle this object:
pickle.dumps(my_test)
它应该失败,并提供回溯:

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  --- snip snip a lot of lines ---
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle file objects
这将为您提供如下内容:
“c\uuuuu main\uuuuuu\ntest\np0\n(S'test1234567890.txt'\np1\ntp2\nRp3\n.”
,可用于使用打开的文件句柄重新创建对象:

print(vars(pickle.loads(saved_object)))
通常,最大的困惑在于
\uuuuu reduce\uuuu
应该返回什么类型的对象。虽然您可以在文档页面中阅读更多关于reduce应该返回什么类型的对象的信息:\uuuuu,但一般来说,它至少需要两个元组:

  • 要调用的空白对象类。在本例中,
    self.\uuuuu类\uuuuu
  • 要传递给类构造函数的参数元组。在本例中,它是单个字符串,是要打开的文件的路径
  • 还有其他可选项目,但您应该在文档中阅读所有关于它们的内容


    希望有帮助!

    但是使用
    \uuuu get\u state\uuuuuu
    \uuu set\u state\uuuuuu
    @Sklavit哪个更好用?
    \uu get\u state\uuuuuuu
    或者
    \uu reduce\uuuuuuu
    ?据我所知,JasonS是高级接口de>-低级。所以我更喜欢使用高级接口。我是否正确理解定义了
    \uuuuuu reduce\uuuuuu
    时不调用
    \uuuuuu getstate\uuuuuuuuu
    ?pickle对象大概是关于记录对象的当前状态。文件句柄是一个很好的例子,它包含了很多自己的状态,只需重新打开禁用该文件不足以恢复
    测试对象的状态。您还需要记录
    self。某些文件已打开.tell()
    以及
    测试类感兴趣的任何其他状态。有关更完整的示例,请参阅(使用
    获取状态
    /
    设置状态
    )。
    print(vars(pickle.loads(saved_object)))