fastapi / typer

Typer, build great CLIs. Easy to code. Based on Python type hints.
https://typer.tiangolo.com/
MIT License
15.77k stars 671 forks source link

required=True support [typer.Option] #361

Open kmcminn opened 2 years ago

kmcminn commented 2 years ago

First Check

Commit to Help

Example Code

import typer
app = typer.Typer()

# currently required options look like this:
@app.command()
def main(
    username: str = typer.Option(..., help="A Username")
):
    <code>

Description

Please make typer.Option required arguments conform to a more readable syntax than ellipsis.

From the function param:

username: str = typer.Option(..., help="A Username")

unless you have working knowledge of this library you wouldn't be able to know if:

Please consider moving this feature to a kwarg in typer.Option.

Wanted Solution

typer.Option supports a new kwarg: required: bool

Wanted Code

import typer
app = typer.Typer()

# This is a more expressive and readable
@app.command()
def main(
    username: str = typer.Option("", help="A Username", required=True)
):
    <code>

Alternatives

N/A

Operating System

Linux

Operating System Details

No response

Typer Version

0.4.0

Python Version

3.9+

Additional Context

No response

joaonc commented 2 years ago

IMO, the current interface is good. Adding the required parameter, would negate the first parameter (default value), which would be weird (the default value is ignored if required=True).

If anything, it should be made clearer in the instructions that to make an Option or Argument required, ... should be the default value.

Alirezaaraby commented 1 year ago

check this out https://typer.tiangolo.com/tutorial/options/required/

teneon commented 1 year ago

I just came across the same problem. I wanted to add a required Option with Choices (Enum). And i didn't want to set a default value, because i wanted that the user gets an error displayed, if he doesn't specify the option. I didn't want default value to execute silently. Hope it makes some sense.

Great package btw ;)