Skip to content

Optional string argument with None default does not work with argument alias #156

@KolinGuo

Description

@KolinGuo

It seemed like Optional[str] argument with None as its default value breaks the specified argument alias.
See the minimal example below where the --vid alias for vendor_id fails to be recognized while the --pid alias for product-id works.

from typing import Annotated, Optional

import tyro


def detect_usb_device(
    vendor_id: Annotated[Optional[str], tyro.conf.arg(aliases=["--vid"])] = None,
    product_id: Annotated[Optional[str], tyro.conf.arg(aliases=["--pid"])] = "",
) -> None:
    """
    Detect connected USB device by vendor_id + product_id.

    :param vendor_id: vendor_id of a specific USB device.
    :param product_id: product_id of a specific USB device.
    """
    print(f"{vendor_id=} {product_id=}")


if __name__ == "__main__":
    tyro.cli(detect_usb_device)
root@machine:/scripts# python3 test.py -h
usage: test.py [-h] [--vendor-id {None}|{None}|STR] [--product-id {None}|STR]

Detect connected USB device by vendor_id + product_id.

╭─ options ─────────────────────────────────────────────────────────────╮
│ -h, --help        show this help message and exit                     │
│ --vendor-id {None}|{None}|STR                                         │
│                   vendor_id of a specific USB device. (default: None) │
│ --product-id {None}|STR, --pid {None}|STR                             │
│                   product_id of a specific USB device. (default: '')  │
╰───────────────────────────────────────────────────────────────────────╯
root@machine:/scripts# python3 test.py --vid 1234
╭─ Unrecognized options ────────────────╮
│ Unrecognized options: --vid           │
│ ───────────────────────────────────── │
│ For full helptext, run test.py --help │
╰───────────────────────────────────────╯

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions