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 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
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)