Python Pickle

G

gerardob

I have a problem using Pickle inside a class object.

The following code works:

m2 = markov_model.MarkovModel()
m2 = pickle.load(open("prueba", 'rb'))
print m2.n

However, if I create the following method inside markov_model.MarkovModel:

def load_model_from_file(self, name):
try:
file = open(name, 'rb')
self = pickle.load(file)
file.close()
except pickle.PicklingError:
print "PicklingError"

and then run:

m2 = markov_model.MarkovModel()
m2.load_model_from_file("prueba")
print m2.n

it says that 'MarkovModel' object has no attribute 'n'. If the printing of
'n' i put it inside (at the end) of the method load_model_from_file as
'print self.n' it works.

How can i solve this?
Thanks.
 
B

Bruno Desthuilliers

gerardob a écrit :
I have a problem using Pickle inside a class object.

The following code works:

m2 = markov_model.MarkovModel()
m2 = pickle.load(open("prueba", 'rb'))

Given the second line, the first is totally useless.
print m2.n

However, if I create the following method inside markov_model.MarkovModel:

def load_model_from_file(self, name):
try:
file = open(name, 'rb')
self = pickle.load(file)

This doesn't work - or, more exactly, this doesn't work the way you
expect it to work !-)

Remember that there's nothing magical with 'self' - it's just a local
name in a function. Rebinding it within the function's body only affects
the function's local namespace.

What you want is to make load_model_from_file a classmethod and make it
return the unpickled object instead.

file.close()
except pickle.PicklingError:
print "PicklingError"

Useless exception handling - you lose all the relevant informations.
and then run:

m2 = markov_model.MarkovModel()
m2.load_model_from_file("prueba")
print m2.n

it says that 'MarkovModel' object has no attribute 'n'. If the printing of
'n' i put it inside (at the end) of the method load_model_from_file as
'print self.n' it works.

Indeed - at this stage, the *local* 'self' name has been rebound to the
unpickled object.

Also and fwiw, if you expect a MarkovModel instance to have a 'n'
attribute, you should bind it (at least to a sensible default value) in
the class __init__ method.
How can i solve this?

cf above.

HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,053
Latest member
BrodieSola

Latest Threads

Top