You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When adding an argument which is a union of two types there seems to be no direct way of specifying the desired type to be parsed/instantiated. This seems to be automatically detected from the argument names and values which is undesirable in scenarios where subtypes have similar arguments but different behaviors when instantiated.
To reproduce
from dataclasses import dataclass
from jsonargparse import ArgumentParser
@dataclass
class A:
foo: int
@dataclass
class B:
foo: int
bar: float = 1.0
if __name__ == "__main__":
parser = ArgumentParser(description="Example CLI", exit_on_error=False)
parser.add_argument("--cfg", type=A | B)
args = parser.parse_args(["--cfg.foo=1"])
print(args)
print(parser.instantiate_classes(args))
Expected behavior
A way of selecting the desired subtype from the command line.
Environment
jsonargparse version: 4.33.1
Python version: 3.10
How jsonargparse was installed: pip
OS: MacOS
The text was updated successfully, but these errors were encountered:
Explanation. Types inside Union are parsed from left to right. The first one that succeeds is chosen. In the example above since only foo is provided, then A succeeds and there is no attempt at B. Right now the only way is to specify bar so that A fails and it gets parsed as B.
Unfortunately this is not an easy fix. I do have in mind a big internal change that would fix this, which is needed to support other cases, e.g. #287. But this will take time.
Let me know if I can help, ideally it would be nice if the union type werer treated in the same way subclasses are, the first argument selects the type and defines the help string and then the following arguments get matched against the choice of class/type
🐛 Bug report
No way of selecting a subtype from a union type.
When adding an argument which is a union of two types there seems to be no direct way of specifying the desired type to be parsed/instantiated. This seems to be automatically detected from the argument names and values which is undesirable in scenarios where subtypes have similar arguments but different behaviors when instantiated.
To reproduce
Expected behavior
A way of selecting the desired subtype from the command line.
Environment
The text was updated successfully, but these errors were encountered: