tiangolo / typer

Typer, build great CLIs. Easy to code. Based on Python type hints.

Home Page:https://typer.tiangolo.com/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Ignoring an argument for typer command

lvijnck opened this issue · comments

First Check

  • I added a very descriptive title to this issue.
  • I used the GitHub search to find a similar issue and didn't find it.
  • I searched the Typer documentation, with the integrated search.
  • I already searched in Google "How to X in Typer" and didn't find any information.
  • I already read and followed all the tutorial in the docs and didn't find an answer.
  • I already checked if it is not related to Typer but to Click.

Commit to Help

  • I commit to help with one of those options 👆

Example Code

def serialize_dfs(func):
    """Decorator function to automatically (de)-serialize input and output
    dataframes for the function. It leverages the `df_path` and `df_output_path`
    kwargs to serialize input and output dataframes respectively.

    Args:
        func: function to decorate
    Returns:
        List of deduplicated column names
    """
    def wrapper(
        *args,
        dataframe: Optional[pd.DataFrame] = None,
        df_path: Optional[str] = None,
        df_output_path: Optional[str] = None,
        **kwargs
    ):
        # When df path specified, load it and pass it into the function
        if df_path:
            dataframe = pd.read_csv(df_path)

        # Invoke original function
        result: pd.DataFrame = func(*args, dataframe=dataframe, **kwargs)

        # When output path specified, serialize it into output
        if df_output_path:
            result.to_csv(df_output_path, index=False)

        return result

    return wrapper

@app.command()
@serialize_dfs
def expand_columns(
    dataframe: pd.DataFrame = typer.Argument(lazy=True, default=None, formats=[""], hidden=True, expose_value=False),
    keys_col: str = "metadata_name",
    values_col: str = "metadata_value",
    col_format: str = "{column_name}{num}",
) -> pd.DataFrame:
   # ... logic here

Description

I have a few functions that I want to type that handle dataframes (both as input and output). I do have a decorator that allows for specifying the dataframes as paths (as opposed to the objects).

Out of this decorator, I now wish to construct a Typer command. Though I keep getting the following error:

RuntimeError: Type not yet supported.

Is there an option to completely ignore an argument to the Typer CLI? I tried:

  • Hidden=True
  • Default=None
  • Expose_value=False
  • Lazy=True

Operating System

macOS

Operating System Details

No response

Typer Version

typer==0.6.1

Python Version

3.9

Additional Context

No response

I assume you solved it, thanks for closing the issue 👍

Hiya @tiangolo! I assumed I solved it, but re-opening as I am still unable to skip the argument.

Any ideas on how to solve this one? For the moment being I omitted my type hints but it's far from ideal.

Have a look at my little package sitk-cli . I do something very similar, just for images. The function make_cli replaces arguments of type image with pathlib.Path and does loading/saving.

I use this concept with typer to create command lines from library code.

import SimpleITK as sitk
import typer

from sitk_cli import make_cli


def fill_holes_slice_by_slice(mask: sitk.Image) -> sitk.Image:
    mask = mask != 0
    output = sitk.Image(mask.GetSize(), mask.GetPixelID())
    output.CopyInformation(mask)
    for k in range(mask.GetSize()[2]):
        output[:, :, k] = sitk.BinaryFillhole(mask[:, :, k], fullyConnected=False)
    return output


if __name__ == "__main__":
    typer.run(make_cli(fill_holes_slice_by_slice))