configdict¶
This package provides two classes, CheckedDict
and ConfigDict
,
which allow to define a dict with default values and a set of allowed keys.
Any modification to the dict can be validated against a set of rules.
configdict.configdict Module¶
CheckedDict¶
A dictionary based on a default prototype. A CheckedDict
can only define
key:value
pairs which are already present in the default. It is possible to
define a docstring for each key and different restrictions for the values
regarding possible values, ranges and type. A CheckedDict is useful for
configuration settings.
If no mutable values are used, a CheckedDict is hashable
ConfigDict¶
Based on CheckedDict
, a ConfigDict
is a persistent, unique dictionary. It is
saved under the config folder determined by the OS and it is updated with each
modification. It is useful for implementing configuration of a module / library
/ app, where there is a default/initial state and the user needs to be able to
configure global settings which must be persisted between sessions (similar to
the settings in an application)
Example
from configdict import ConfigDict
config = ConfigDict("myproj.subproj")
config.addKey("keyA", 10, doc="documentaion of keyA")
config.addKey("keyB", 0.5, range=(0, 1))
config.addKey("keyC", "blue", choices=("blue", "red"),
doc="documentation of keyC")
config.load()
Alternativaly, a ConfigDict
or a CheckedDict
can be built
via a context manager:
with ConfigDict("plotting") as cfg:
# While building a config, __call__ is equivalent to addKey
cfg('backend', 'matplotlib', choices={'matlotlib'})
cfg('spectrogram.figsize', (24, 8))
cfg('spectrogram.maxfreq', 12000,
doc="Highest frequency in a spectrogram")
cfg('spectrogram.window', 'hamming', choices={'hamming', 'hanning'})
# no need to call .load, it is called automatically
A ConfigDict
can be created all at once
config = ConfigDict("myapp",
default = {
'font-size': 10.0,
'font-family': "Monospace",
'port' : 9100,
},
validator = {
'font-size::range' : (8, 24),
'port::range' : (9000, 65000),
'font-family::choices' : {'Roboto', 'Monospace'},
'port': lambda cfg, port: checkPortAvailable(port)
},
docs = {
'port': 'The port number to listen to',
'font-size': 'The size of the font, in pixels'
}
)
This will create the dictionary and load any persisted version. Any saved
modifications will override the default values. Whenever the user changes any
value (via config[key] = newvalue
) the dictionary will be saved.
In all other respects a ConfigDict
behaves like a normal dictionary.
Functions¶
|
Retrieve a previously created ConfigDict. |
Returns a dict of active configs |
|
|
Given a config name, return the path where it should be saved |
Classes¶
|
A dictionary which checks that the keys and values are valid according to a default dict and a validator. |
|
This is an optionally persistent dictionary used for configuration. |