Page 2 of 2

Re: best approach for an application config file

Posted: Sat Jan 20, 2018 3:15 pm
by on4aa
There is one caveat with pickle, though.
Quoting from the documentation:
The Python funcitons eval and exec invoke the compiler at runtime, which requires significant amounts of RAM. Note that the pickle library from micropython-lib employs exec. It may be more RAM efficient to use the ujson library for object serialisation.

Re: best approach for an application config file

Posted: Sat Jan 20, 2018 6:07 pm
by pythoncoder
Agreed. There is also this issue which should be borne in mind. I've admired the elegance of Pickle since I first discovered Python but it has its limitations. But Pickle can handle virtually all Python objects whereas JSON cannot. Horses for courses, but I too would use JSON where possible.

Re: best approach for an application config file

Posted: Mon Jan 22, 2018 6:10 pm
by dhylands
You can also use good ole python. This works well for read-only configuration information.

Just create a python module and import it.

Re: best approach for an application config file

Posted: Mon Jan 29, 2018 2:19 pm
by ghusson
After reading this post, I wrote a sample class here under. Feel free to share, test, enhance !
Example :
my_jsonfile = jsonfile("./test.json", default_data = {"a": "porty", "b": "portx"})
print(my_jsonfile.get_data())
update_data = {"c": "portc", "b": "portb"}
my_jsonfile.update_data_dict(update_data)
print(my_jsonfile.get_data())
my_jsonfile.store_data()

Code: Select all

# Copyright 2017 Gautier HUSSON - Liberasys

# The MIT License (MIT)
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

try:
    import ujson as json
except ImportError:
    try:
        import json
    except ImportError:
        print("No json library not found.")
        raise SystemExit


class jsonfile:
    ''' This class loads and stores a data from and to a file with json formalism.'''

    def __init__(self, file_path, default_data = {}):
        ''' mandatory argument : file path
            optional argument : default data
              if none provided, an empty dictionnary is set'''

        self.file_path = file_path
        self.data = default_data
        self.load_file()


    def load_file(self):
        ''' Returns the data loaded from json file, or the default one '''

        try:
            with open(self.file_path) as json_file:
                data_from_file = json.loads(json_file.read())
        
        except (OSError, ValueError, IOError):
            print("Couldn't load " + self.file_path + ". Creating a default one.")
            self.store_data()
        
        else:
            if type(self.data) is dict and type(data_from_file) is dict:
                self.data.update(data_from_file)
            else:
                self.data = data_from_file
            print("Loaded config from " + self.file_path + ".")
            json_file.close()


    def get_data(self):
        ''' Returns the data '''
        return(self.data)


    def set_data(self, new_data):
        ''' Stores the data in the instance '''
        self.data = new_data


    def update_data_dict(self, dict_to_be_merged):
        ''' Merges the dictionnary given in argument with self data dictionnary '''
        if type(self.data) is dict and type(dict_to_be_merged) is dict:
            self.data.update(dict_to_be_merged)
        else:
            print("Trying to update dictionnary, but non dict found.")
            raise SystemExit


    def store_data(self):
        ''' Saves the data to json file.'''
        try:
            with open(self.file_path, "w") as json_file:
                json_file.write(json.dumps(self.data))
        except OSError:
            print("Couldn't save " + self.file_path + ".")


#if __name__ == "__main__":
#    my_jsonfile = jsonfile("./test.json", default_data = {"a": "porty", "b": "portx"})
#    print(my_jsonfile.get_data())
#    update_data = {"c": "portc", "b": "portb"}
#    my_jsonfile.update_data_dict(update_data)
#    print(my_jsonfile.get_data())
#    my_jsonfile.store_data()






Re: best approach for an application config file

Posted: Mon Apr 23, 2018 4:46 pm
by jimako
dhylands wrote:
Mon Jan 22, 2018 6:10 pm
You can also use good ole python. This works well for read-only configuration information.

Just create a python module and import it.
That is my preferred method as well. And here is an example on how I use it, in case somebody is looking how to use this method.

Create a `config.py` file:

Code: Select all

WIFI_SSID = "myssid"
WIFI_PASSWORD = "mysecretpassword"
Then in you main script file:

Code: Select all

import config
import network

sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(config.WIFI_SSID, config.WIFI_PASSWORD)

Re: best approach for an application config file

Posted: Mon Apr 23, 2018 6:43 pm
by stijn
Another vote for Python config files here: it's simple, just works with all possible types, convenient, and moreover, it's actual code: we have a lot of configuration which requires mathematical calculations so with a Python config the whole calculation becomes part of the file and serves as documentation. Otherwise we'd have to use a seperate script to generate a config file..

Re: best approach for an application config file

Posted: Tue Apr 24, 2018 3:26 pm
by kamikaze
The best config for Python app is Python code! it is much faster to "translate" than any third-party stuff. And you don't need to spend extra CPU and RAM to translate it in runtime