Aller au contenu

Mise en route

Installation

Installez la bibliothèque avec pip :

$ pip install confit

Un exemple simple

Confit n'abstrait que le code standard lié à la configuration et laisse le reste de votre code inchangé.

Voici un exemple :

script.py
import datetime
+ from confit import Cli, Registry, RegistryCollection

+ app = Cli(pretty_exceptions_show_locals=False)

+ class RegistryCollection(:
+     factory = Registry(("test_cli", "factory"), entry_points=True)

+ @registry.factory.register("submodel")
class SubModel:
    # Le typage est facultatif mais recommandé pour bénéficier du transtypage des arguments
    def __init__(self, value: float, desc: str = ""):
        self.value = value
        self.desc = desc


+ @registry.factory.register("bigmodel")
class BigModel:
    def __init__(self, date: datetime.date, submodel: SubModel):
        self.date = date
        self.submodel = submodel


+ @app.command(name="script", registry=registry)
def func(modelA: BigModel, modelB: BigModel, other: int, seed: int):
    assert modelA.submodel is modelB.submodel
    assert modelA.date == datetime.date(2010, 10, 10)
    print("Autre :", other)

+ if __name__ == "__main__":
+     app()

Créez un nouveau fichier de configuration

config.cfg
# CLI sections
[script]
modelA = ${modelA}
modelB = ${modelB}

# CLI common parameters
[modelA]
@factory = "bigmodel"
date = "2010-10-10"

[modelA.submodel]
@factory = "submodel"
value = 12

[modelB]
date = "2003-04-05"
submodel = ${modelA.submodel}

et exécutez la commande suivante depuis le terminal

$ python script.py --config config.cfg --seed 42
config.yaml
script:
  modelA: ${modelA}
  modelB: ${modelB}

modelA:
  "@factory": "bigmodel"
  date: "2010-10-10"

  submodel:
    "@factory": "submodel"
    value: 12

modelB:
  date: "2003-04-05"
  submodel: ${modelA.submodel}

et exécutez la commande suivante depuis le terminal

$ python script.py --config config.yaml --seed 42

Nom

Pour utiliser le nom de votre chemin de configuration (par exemple config-expe-2 si le fichier de configuration est nommé config-expe-2.cfg dans* la configuration (après résolution), mentionnez simplement name = None sous la section dont le titre a été fourni à @app.command(name=<section-title>)

Configurations multiples

Vous pouvez passer plusieurs fichiers de configuration en répétant l'option --config. La configuration sera fusionnée dans l'ordre.

Vous pouvez toujours appeler la méthode function depuis votre code, mais vous bénéficiez maintenant également de la validation des arguments !

from script import func, BigModel, SubModel

# Pour initialiser la graine avant de créer les modèles
from confit.utils.random import set_seed

seed = 42
set_seed(seed)

submodel = SubModel(value=12)
# BigModel convertira les chaînes de caractères de date en objets datetime.date
modelA = BigModel(date="2003-02-01", submodel=submodel)
modelB = BigModel(date="2003-04-05", submodel=submodel)
func(
    modelA=modelA,
    modelB=modelA,
    seed=seed,
)