PlainConfiguration

class upsilonconf.PlainConfiguration(**kwargs: Any)[source]

Mutable configuration.

PlainConfiguration is a mutable ConfigurationBase implementation. This means that values can be added, changed and/or deleted.

Added in version 0.7.0.

Warning

In the current implementation, using method names as keys is possible,

>>> conf = PlainConfiguration()
>>> print(conf.items)
<bound method ConfigurationBase.items of PlainConfiguration()>
>>> conf["items"] = 123
>>> print(conf.items)
123

but it can lead to some unexpected behaviour.

>>> print(conf)
{items: 123}
>>> conf == {"items": 123}
Traceback (most recent call last):
    ...
TypeError: 'int' object is not callable

See also

ConfigurationBase

the configuration interface.

FrozenConfiguration

an immutable configuration.

Examples

Starting with a simple configuration.

>>> conf = PlainConfiguration(foo=0, bar="bar", baz={'a': 1, 'b': 2})
>>> print(conf)
{foo: 0, bar: bar, baz: {a: 1, b: 2}}

Variables can be added, changed or removed as desired.

>>> conf.surprise = None
>>> print(conf)
{foo: 0, bar: bar, baz: {a: 1, b: 2}, surprise: None}
>>> conf["surprise"] = []
>>> print(conf)
{foo: 0, bar: bar, baz: {a: 1, b: 2}, surprise: []}
>>> del conf.baz.a
>>> print(conf)
{foo: 0, bar: bar, baz: {b: 2}, surprise: []}

Creating a single value in a subconfig is possible, but only using indexing syntax, not with attribute syntax.

>>> conf.sub.val = 0
Traceback (most recent call last):
    ...
AttributeError: 'PlainConfiguration' object has no attribute 'sub'
>>> conf["sub", "val"] = -1
>>> print(conf)
{foo: 0, bar: bar, baz: {b: 2}, surprise: [], sub: {val: -1}}
>>> conf['surprise'] = {"val": "tada"}
>>> print(conf)
{foo: 0, bar: bar, baz: {b: 2}, surprise: {val: tada}, sub: {val: -1}}