python 如何使用“泡菜”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2019489/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 23:34:48  来源:igfitidea点击:

how to use 'pickle'

pythonpickle

提问by zjm1126

my code(i was unable to use 'pickle'):

我的代码(我无法使用“pickle”):

class A(object):
    def __getstate__(self):
        print 'www'
        return 'sss'
    def __setstate__(self,d):
        print 'aaaa'

import pickle
a = A()
s = pickle.dumps(a)
e = pickle.loads(s)
print s,e

print :

打印 :

www
aaaa
ccopy_reg
_reconstructor
p0
(c__main__
A
p1
c__builtin__
object
p2
Ntp3
Rp4
S'sss'
p5
b. <__main__.A object at 0x00B08CF0>

who can tell me how to use.

谁能告诉我怎么用。

回答by wisty

What are you trying to do? It works for me:

你想做什么?这个对我有用:

class A(object):
    def __init__(self):
        self.val = 100

    def __str__(self):
        """What a looks like if your print it"""
        return 'A:'+str(self.val)

import pickle
a = A()
a_pickled = pickle.dumps(a)
a.val = 200
a2 = pickle.loads(a_pickled)
print 'the original a'
print a
print # newline
print 'a2 - a clone of a before we changed the value'
print a2
print 

print 'Why are you trying to use __setstate__, not __init__?'
print

So this will print:

所以这将打印:

the original a
A:200

a2 - a clone of a before we changed the value
A:100

If you need setstate:

如果您需要设置状态:

class B(object):
    def __init__(self):
        print 'Perhaps __init__ must not happen twice?'
        print
        self.val = 100

    def __str__(self):
        """What a looks like if your print it"""
        return 'B:'+str(self.val)

    def __getstate__(self):
        return self.val

    def __setstate__(self,val):
        self.val = val

b = B()
b_pickled = pickle.dumps(b)
b.val = 200
b2 = pickle.loads(b_pickled)
print 'the original b'
print b
print # newline
print 'b2 - b clone of b before we changed the value'
print b2

which prints:

打印:

Why are you trying to use __setstate__, not __init__?

Perhaps __init__ must not happen twice?

the original b
B:200

b2 - b clone of b before we changed the value
B:100

回答by miku

You are able to pickle(meaning, this code works as it should). You just seem to get a result, you don't expect. If you expect the same 'output', try:

您可以pickle(意思是,此代码可以正常工作)。你似乎只是得到了一个结果,你并不期待。如果您期望相同的“输出”,请尝试:

import pickle
a = A()
s = pickle.dumps(a)
e = pickle.loads(s)
print s, pickle.dumps(e)

Your example isn't, well, a typical 'pickling' example. Usually pickled objects are saved somewhere persistently or sent over the wire. See e.g. pickletest.py: http://www.sthurlow.com/python/lesson10/.

您的示例不是典型的“酸洗”示例。通常腌制的对象会永久保存在某处或通过网络发送。参见例如pickletest.pyhttp: //www.sthurlow.com/python/lesson10/

There are advanced uses of pickling, see for example David Mertz XML object serialisation article: http://www.ibm.com/developerworks/xml/library/x-matters11.html

有高级用法pickling,例如参见 David Mertz XML 对象序列化文章:http: //www.ibm.com/developerworks/xml/library/x-matters11.html

回答by CNBorn

In a nutshell, in your example, e equals a.

简而言之,在您的示例中,e 等于 a。

Don't have to care about these strang strings, you can dumps these strings to save to anywhere, just remember when you loads them, you got 'a' object again.

不必关心这些奇怪的字符串,你可以将这些字符串转储到任何地方,只要记住当你加载它们时,你又得到了 'a' 对象。