tiramisu/docs/browse.rst

159 lines
4.7 KiB
ReStructuredText
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Browse the :class:`Config`
===========================
Getting the options
----------------------
.. note:: The :class:`Config` object we are using is located here in this script:
:download:`download the source <src/property.py>`
Let's retrieve the config object, named `cfg`
.. code-block:: python
from property import cfg
We retrieve by path an option named `var1`
and then we retrieve its name and its docstring
.. code-block:: bash
:emphasize-lines: 2, 5, 8
print(cfg.option('od1.var1'))
<tiramisu.api.TiramisuOption object at 0x7f3876cc5940>
print(cfg.option('od1.var1').option.name())
'var1'
print(cfg.option('od1.var1').option.doc())
'first option'
Accessing the values of the options
-------------------------------------
Let's browse the configuration structure and option values.
You have getters as a `get` method on option objects:
.. code-block:: bash
:emphasize-lines: 10, 14
# getting all the options
print(cfg.option.value.get())
{'var1': None, 'var2': 'value'}
# getting the `od1` option description
print(cfg.option('od1').value.get())
{'od1.var1': None, 'od1.var2': 'value'}
# getting the var1 option's value
print(cfg.option('od1.var1').value.get())
None
# getting the var2 option's default value
print(cfg.option('od1.var2').value.get())
'value'
# trying to get a non existent option's value
cfg.option('od1.idontexist').value.get()
AttributeError: unknown option "idontexist" in optiondescription "od1"
Setting the value of an option
------------------------------
An important part of the setting's configuration consists of setting the
value's option.
You have setters as a `set` method on option objects.
And if you wanna come back to a default value, use the `reset()` method.
.. code-block:: bash
:emphasize-lines: 2
# changing the `od1.var1` value
cfg.option('od1.var1').value.set('éééé')
print(cfg.option('od1.var1').value.get())
'éééé'
# carefull to the type of the value to be set
cfg.option('od1.var1').value.set(23454)
ValueError: "23454" is an invalid string for "first variable"
# let's come back to the default value
cfg.option('od1.var2').value.reset()
print(cfg.option('od1.var2').value.get())
'value'
.. important:: If the config is `read only`, setting an option's value isn't allowed, see :doc:`property`
Let's make the protocol of accessing a `Config`'s option explicit
(because explicit is better than implicit):
1. If the option has not been declared, an `Error` is raised,
2. If an option is declared, but neither a value nor a default value has
been set, the returned value is `None`,
3. If an option is declared and a default value has been set, but no value
has been set, the returned value is the default value of the option,
4. If an option is declared, and a value has been set, the returned value is
the value of the option.
But there are special exceptions. We will see later on that an option can be a
:term:`mandatory option`. A mandatory option is an option that must have a value
defined.
Searching for an option
~~~~~~~~~~~~~~~~~~~~~~~~~~
In an application, knowing the path of an option is not always feasible.
That's why a tree of options can easily be searched with the :func:`find()` method.
Let's find an option by it's name
And let's find first an option by it's name
The search can be performed in a subtree
.. code-block:: bash
:emphasize-lines: 1, 6, 19
print(cfg.option.find(name='var1'))
# [<tiramisu.api.TiramisuOption object at 0x7f490a530f98>, <tiramisu.api.TiramisuOption object at 0x7f490a530748>]
# If the option name is unique, the search can be stopped once one matched option
# has been found:
print(cfg.option.find(name='var1', first=True))
# <tiramisu.api.TiramisuOption object at 0x7f6c2beae128>
# a search object behaves like a cfg object, for example
print(cfg.option.find(name='var1', first=True).option.name())
# 'var1'
print(cfg.option.find(name='var1', first=True).option.doc())
# a search can be made with various criteria
print(cfg.option.find(name='var3', value=undefined))
print(cfg.option.find(name='var3', type=StrOption))
# the find method can be used in subconfigs
print(cfg.option('od2').find('var1'))
:download:`download the config used for the find <src/find.py>`
The `get` flattening utility
-------------------------------------
In a config or a subconfig, you can print a dict-like representation
.. code-block:: bash
:emphasize-lines: 2
# get the `od1` option description
print(cfg.option('od1').value.get())
{'od1.var1': 'éééé', 'od1.var2': 'value'}