-
First Check
Commit to Help
Example Codedef 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 DescriptionI 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:
Is there an option to completely ignore an argument to the Typer CLI? I tried:
Operating SystemmacOS Operating System DetailsNo response Typer Versiontyper==0.6.1 Python Version3.9 Additional ContextNo response |
Beta Was this translation helpful? Give feedback.
Replies: 5 comments
-
I assume you solved it, thanks for closing the issue 👍 |
Beta Was this translation helpful? Give feedback.
-
Hiya @tiangolo! I assumed I solved it, but re-opening as I am still unable to skip the argument. |
Beta Was this translation helpful? Give feedback.
-
Any ideas on how to solve this one? For the moment being I omitted my type hints but it's far from ideal. |
Beta Was this translation helpful? Give feedback.
-
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)) |
Beta Was this translation helpful? Give feedback.
-
Just a quick note for anyone else that I ran into this, and the simplest way I could find to skip an option is the below annotation. skipped_option = typer.Option(parser=lambda _: _, hidden=True, expose_value=False) Which you can use as e.g. def foo(a: int, b: Annotate[str, skipped_option] = 'some default'): ... This works because
(The parser argument is the key part missing from the start of this issue). It would be great to have this as a simpler documented feature - but I'm not sure how easy this would be? |
Beta Was this translation helpful? Give feedback.
Just a quick note for anyone else that I ran into this, and the simplest way I could find to skip an option is the below annotation.
Which you can use as e.g.
This works because
hidden=True
- hides it from display in the arg listexpose_value=False
- stops any parsed value from being parsedparser=lambda _: _
- indicates that any value passed to the parser should be maintained.(The parser argument is the key part missing from the start of this issue).
It would be great to have this as a simpler documented feature - but I'm not sure h…