Skip to content

click.Choice prompt with StrEnum displays enum values but requires enum names #3028

@lodo1995

Description

@lodo1995

How to replicate:

main.py:

import click
from enum import StrEnum

class MyOpt(StrEnum):
    NAME_1 = "value-1"
    NAME_2 = "value-2"
    NAME_3 = "value-3"

@click.command()
@click.option("--my-opt", type=click.Choice(MyOpt), prompt = True)
def main(my_opt):
    pass

if __name__ == "__main__":
    main()

executed with:

> uv init click-strenum-bug
> cd click-strenum-bug
> uv add click
> uv run main.py
My opt (value-1, value-2, value-3): value-1
Error: 'value-1' is not one of 'NAME_1', 'NAME_2', 'NAME_3'.

The prompt suggests the StrEnum values, but the validation requires the StrEnum names.

Expected output

Either of the following would be acceptable.

StrEnum values used consistently:

> uv run main.py
My opt (value-1, value-2, value-3): asdf
Error: 'asdf' is not one of 'value-1', 'value-2', 'value-3'.

StrEnum names used consistently:

> uv run main.py
My opt (NAME_1, NAME_2, NAME_3): asdf
Error: 'asdf' is not one of 'NAME_1', 'NAME_2', 'NAME_3'.

Environment

  • Python version: 3.13
  • Click version: 8.2.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions