omni-us / jsonargparse

Implement minimal boilerplate CLIs derived from type hints and parse from command line, config files and environment variables
https://jsonargparse.readthedocs.io
MIT License
314 stars 42 forks source link

In python 3.11, add_subclass_arguments with list[Class] is not working. #456

Closed harimkang closed 2 months ago

harimkang commented 6 months ago

🐛 Bug report

Hi all, I'm working on a project that utilizes this great library. However, I ran into a problem with python 3.11.

scheduler:
  - class_path: otx.algo.schedulers.warmup_schedulers.LinearWarmupScheduler
    init_args:
      num_warmup_steps: 10
  - class_path: lightning.pytorch.cli.ReduceLROnPlateau
    init_args:
      mode: max
      factor: 0.5
      patience: 1
      monitor: val/accuracy
parser.add_subclass_arguments(
            baseclass=(LRScheduler, ReduceLROnPlateau, list[LRSchedulerTypeUnion]),
            nested_key="scheduler",
            **scheduler_kwargs,
        )

I've been configuring arguments like the one above in project, which is mainly python 3.10 (& 3.9), but this doesn't work since python 3.11. The reason for this is that as of python 3.11, list[Optimizer] is False in inspect.isclass(). https://github.com/omni-us/jsonargparse/blob/88fc9c8782fd959aa844b9bfa1ab3a324132b842/jsonargparse/_signatures.py#L502-L503 If I comment out that if statement and the raise statement, this works fine. Do I need to use a different method to use list[Optimizer] or list[Scheduler]? This used to work in python 3.9 and 3.10, but a new workaround is needed in 3.11.

I was wondering if could relax that if statement to make it more flexible.

To reproduce

Expected behavior

Environment

mauvilsa commented 6 months ago

Thank you for reporting! It does seem to be a bug. I will look at it.