Skip to content

Dataclasses as function parameters

Basic version

Basic use of classes as parameters

> python examples/dataclasses/basic.py --help
Usage: examples/dataclasses/basic.py

╭─ Eager Callbacks ────────────────────────────────────────────────────────────────────────────────╮
│   --help     Display the help message                                                            │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
│ ╭─ x ──────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ Method generated by attrs for class Fraction.                                                │ │
│ │   --x-numerator       int                                                                    │ │
│ │   --x-denominator     int                                                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
from attrs import mutable

from thermite import run


@mutable
class Fraction:
    numerator: int
    denominator: int


def fraction(x: Fraction):
    print(f"{x.numerator}/{x.denominator} = {x.numerator/x.denominator}")


if __name__ == "__main__":
    run(fraction)

As arguments

All options as arguments

> python examples/dataclasses/with_arguments.py --help
Usage: examples/dataclasses/with_arguments.py

╭─ Eager Callbacks ────────────────────────────────────────────────────────────────────────────────╮
│   --help     Display the help message                                                            │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
│   numerator       int                                                                            │
│   denominator     int                                                                            │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
from typing import Any

from attrs import mutable

from thermite import CliParamKind, Config, Event, ObjSignature, run

config = Config()


@mutable
class Fraction:
    numerator: int
    denominator: int


def fraction(x: Fraction):
    print(f"{x.numerator}/{x.denominator} = {x.numerator/x.denominator}")


@config.event_cb_deco(Event.SIG_EXTRACT, Fraction)
def to_args(sig: ObjSignature, _: Any):
    sig.params["numerator"].cli_kind = CliParamKind.ARGUMENT
    sig.params["denominator"].cli_kind = CliParamKind.ARGUMENT
    return sig


if __name__ == "__main__":
    run(fraction, config=config)

With custom converter

Using custom converter

> python examples/dataclasses/custom_converter.py --help
Usage: examples/dataclasses/custom_converter.py [OPTIONS]

╭─ Eager Callbacks ────────────────────────────────────────────────────────────────────────────────╮
│   --help     Display the help message                                                            │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
│   --x     Fraction                                                                               │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
from functools import partial

from attrs import mutable

from thermite import BasicCLIArgConverter, Config, run


@mutable
class Fraction:
    numerator: int
    denominator: int


def fraction_convert(x: str):
    return Fraction(int(x.split("/")[0]), int(x.split("/")[1]))


config = Config()
config.cli_args_store.add_converter_factory(
    partial(
        BasicCLIArgConverter.factory,
        supported_type=Fraction,
        conv_func=fraction_convert,
    ),
    11,
)


def fraction(x: Fraction):
    print(f"{x.numerator}/{x.denominator} = {x.numerator/x.denominator}")


if __name__ == "__main__":
    run(fraction, config=config)