diff --git a/src/pyquickhelper/ipythonhelper/magic_parser.py b/src/pyquickhelper/ipythonhelper/magic_parser.py index d23d15dbf..de318ab23 100644 --- a/src/pyquickhelper/ipythonhelper/magic_parser.py +++ b/src/pyquickhelper/ipythonhelper/magic_parser.py @@ -18,6 +18,48 @@ class MagicCommandParser (argparse.ArgumentParser): .. versionadded:: 0.9 """ + def __init__(self, *l, **p): + """ + custom constructor, see `ArgumentParser `_ + """ + argparse.ArgumentParser.__init__(self, *l, **p) + self._keep_args = {} + + @staticmethod + def _private_get_name(*args): + """ + guesses the name of a parameter knowning the argument + given to @see me add_argument + """ + for i, a in enumerate(args): + if isinstance(a, str): + if a[0] != "-": + return a + elif a.startswith("--"): + return a[2:].replace("-", "_") + raise KeyError("unable to find parameter name in: " + str(args)) + + def add_argument(self, *args, **kwargs): + """ + overloads the methods, see `ArgumentParser `_ + """ + super(argparse.ArgumentParser, self).add_argument(*args, **kwargs) + if args != ('-h', '--help'): + name = MagicCommandParser._private_get_name(*args) + self._keep_args[name] = (args, kwargs) + + def has_choices(self, name): + """ + tells if a parameter has choises + + @param name parameter name + @return boolean + """ + if name not in self._keep_args: + raise KeyError("unable to find parameter name: {0} in {1}".format( + name, list(self._keep_args.keys()))) + return "choices" in self._keep_args[name][1] + def parse_cmd(self, line, context=None, fLOG=noLOG): """ split line using `shlex `_ @@ -34,9 +76,13 @@ def parse_cmd(self, line, context=None, fLOG=noLOG): if context is not None: up = {} for k, v in res.__dict__.items(): - ev = self.eval(v, context=context, fLOG=fLOG) - if ev != v: - up[k] = ev + if self.has_choices(k): + up[k] = v + else: + ev = self.eval(v, context=context, fLOG=fLOG) + if ev != v: + up[k] = ev + if len(up) > 0: for k, v in up.items(): res.__dict__[k] = v