Page 1 of 1

pickle

Posted: Mon Sep 13, 2021 7:34 pm
by RobinMosedale
snippet of code

Code: Select all

import pickle

class configuration_data(object):
   def __init__(self):
      self.flashlight=True # by default flashlight on
      self.hour_start=0 # inhibit alarm hour start
      self.minute_start=0
      self.hour_end=0 # inhibit alarm hour
      self.minute_end=0
      self.inhibit_time=False

   def print_configuration(self):
      print('Flashlight on? ',self.flashlight)
      print('Inhibit time set? ',self.inhibit_time)
      print('Inhibit time start ',self.hour_start,':',self.minute_start)
      print('Inhibit time end ',self.hour_end,':',self.minute_end)

configuration=configuration_data() #create configuration object


print('Configuration ', configuration)
configuration.print_configuration()

try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded ')
   configuration.print_configuration()
except:
   print('Creating configuration file')
   configuration_file=open('configuration','wb')
   pickle.dump(configuration,configuration_file,protocol=None)
   configuration_file.close()
try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded with defaults')
   configuration.print_configuration()
except:
   print('Configuration load failed')

results in:
Creating configuration file
Traceback (most recent call last):
File "main.py", line 1, in <module>
File "main1.py", line 830, in <module>
TypeError: unexpected keyword argument 'protocol'

Omitting the protocol parameter:

Code: Select all

import pickle

class configuration_data(object):
   def __init__(self):
      self.flashlight=True # by default flashlight on
      self.hour_start=0 # inhibit alarm hour start
      self.minute_start=0
      self.hour_end=0 # inhibit alarm hour
      self.minute_end=0
      self.inhibit_time=False

   def print_configuration(self):
      print('Flashlight on? ',self.flashlight)
      print('Inhibit time set? ',self.inhibit_time)
      print('Inhibit time start ',self.hour_start,':',self.minute_start)
      print('Inhibit time end ',self.hour_end,':',self.minute_end)

configuration=configuration_data() #create configuration object


print('Configuration ', configuration)
configuration.print_configuration()

try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded ')
   configuration.print_configuration()
except:
   print('Creating configuration file')
   configuration_file=open('configuration','wb')
   pickle.dump(configuration,configuration_file)
   configuration_file.close()
try:
   configuration_file=open('configuration', 'rb')
   configuration=pickle.load(configuration_file)
   configuration_file.close()
   print('configuration loaded with defaults')
   configuration.print_configuration()
except:
   print('Configuration load failed')

results in:-
Configuration <configuration_data object at 3f94f4b0>
Flashlight on? True
Inhibit time set? False
Inhibit time start 0 : 0
Inhibit time end 0 : 0
Creating configuration file
Configuration load failed

>>> import pickle
>>> help(pickle)
object <module 'pickle' from '/lib/pickle.py'> is of type module
HIGHEST_PROTOCOL -- 0
dump -- <function dump at 0x3f94c180>
__name__ -- pickle
__file__ -- /lib/pickle.py
dumps -- <function dumps at 0x3f94c250>
load -- <function load at 0x3f94c0b0>
loads -- <function loads at 0x3f94c0c0>
>>>

pickle was installed by:
upip.install('pickle')

I've used pickle on Pi's happily.

What am I doing wrong?
Or have I the wrong pickle?

Alternatively I'll serialise a simple dictionary rather than binary object

I've probably stupidly overlooked something

Robin

Re: pickle

Posted: Tue Sep 14, 2021 5:34 am
by pythoncoder
There is a bug in the official pickle module and I raised an issue against it nearly two weeks ago. It is easily fixed for most data as stated in the issue.

However in general I recommend ujson, even though pickle is more powerful. This is because pickle uses the entire Micropython runtime which is very demanding of RAM. You might like to read my notes on serialisation for more details.

Re: pickle

Posted: Tue Sep 14, 2021 12:32 pm
by RobinMosedale
Thank you Peter, as always.
I'll take your advice.

Re: pickle

Posted: Wed Sep 15, 2021 7:19 am
by pythoncoder
The bug I reported was a firmware issue which has gone away. It seems to be associated with a firmware build of V1.16. Upgrading to a daily build has fixed this for me.

My general comments still apply ;)