What's supported
================
For minimum-boilerplate CLIs, :mod:`tyro` aims to maximize support of
Python's standard :mod:`typing` features.
As a partial list, inputs can be annotated with:
- Basic types like :class:`int`, :class:`str`, :class:`float`, :class:`bool`, :class:`pathlib.Path`, :data:`None`.
- :class:`datetime.date`, :class:`datetime.datetime`, and :class:`datetime.time`.
- Container types like :class:`list`, :class:`dict`, :class:`tuple`, and :class:`set`.
- Union types, like ``X | Y``, :py:data:`typing.Union`, and :py:data:`typing.Optional`.
- :py:data:`typing.Literal` and :class:`enum.Enum`.
- Type aliases, for example using Python 3.12's `PEP 695 `_ `type` statement.
- Generics, such as those annotated with :py:class:`typing.TypeVar` or with the type parameter syntax introduced by Python 3.12's `PEP 695 `_.
- Compositions of the above types, like ``tuple[int | str, ...] | None``.
Types can also be placed and nested in various structures, such as:
- :func:`dataclasses.dataclass`.
- ``attrs``, ``pydantic``, and ``flax.linen`` models.
- :py:class:`typing.NamedTuple`.
- :py:class:`typing.TypedDict`, flags like ``total=``, and associated annotations like :py:data:`typing.Required`, :py:data:`typing.NotRequired`, :py:data:`typing.ReadOnly`,
What's not supported
--------------------
There are some limitations. We currently *do not* support:
- Variable-length sequences over nested structures, unless a default is
provided. For types like ``list[Dataclass]``, we require a default value to
infer length from. The length of the corresponding field cannot be changed
from the CLI interface.
- Nesting variable-length sequences in other sequences. ``tuple[int, ...]`` and
``tuple[tuple[int, int, int], ...]`` are supported, as the variable-length
sequence is the outermost type. However, ``tuple[tuple[int, ...], ...]`` is
ambiguous to parse and not supported.
- Self-referential types, like ``type RecursiveList[T] = T | list[RecursiveList[T]]``.
In each of these cases, a :ref:`custom constructor
` can be defined as a workaround.