Overall I like the idea of having a structured way of passing command-line arguments to applications as strings and I think that this is a well-abstracted approach. I also like that this approach still supports the ability to pass strings "as-is" and use them as parameters as well. That opens the door for potentially creating dataclasses which only detail key-parameters that we assume you will use, without blocking you from inputting whatever you want.
On Tue, Mar 26, 2024 at 3:04 PM Luca Vizzarro <luca.vizza...@arm.com> wrote: <snip> > +META_VALUE_ONLY = "value_only" > +META_OPTIONS_END = "options_end" > +META_SHORT_NAME = "short_name" > +META_LONG_NAME = "long_name" > +META_MULTIPLE = "multiple" > +META_MIXINS = "mixins" > + > + I might add some kind of block comment here as a separator that delimits that metadata modifiers start here. Something like what is written in scapy.py which creates sections for XML-RPC method vs ones that are run by the docker container. This isn't something strictly necessary, but it might help break things up and add a little more explanation. > +def value_only(metadata: dict[str, Any] = {}) -> dict[str, Any]: > + """Injects the value of the attribute as-is without flag. Metadata > modifier for :func:`dataclasses.field`.""" > + return {**metadata, META_VALUE_ONLY: True} > + > + <snip> You could do the same thing here for mixins, but again, I'm not sure it's really necessary. > +def field_mixins(*mixins: Mixin, metadata: dict[str, Any] = {}) -> dict[str, > Any]: > + """Takes in a variable number of mixins to manipulate the value's > rendering. Metadata modifier for :func:`dataclasses.field`. > + > + The ``metadata`` keyword argument can be used to chain metadata > modifiers together. > + > + Mixins can be chained together, executed from right to left in the > arguments list order. > + > + Example: > + > + .. code:: python > + > + hex_bitmask: int | None = field(default=0b1101, > metadata=field_mixins(hex, metadata=param_name("mask"))) > + > + will render as ``--mask=0xd``. The :func:`hex` built-in can be used as a > mixin turning a valid integer into a hexadecimal representation. > + """ > + return {**metadata, META_MIXINS: mixins} <snip> > 2.34.1 >