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)))