argparse action on default values
Peter Otten
__peter__ at web.de
Wed Jan 8 13:53:11 EST 2014
Florian Lindner wrote:
> I use argparse from Python 3.3.3 with a custom action that normalizes path
arguments:
>
> http://docs.python.org/3/library/argparse.html#action
>
> def norm_path(*parts):
> """ Returns the normalized, absolute, expanded and joined path,
assembled of all parts. """
> parts = [ str(p) for p in parts ]
This looks odd.
> return os.path.abspath(os.path.expanduser(os.path.join(*parts)))
>
> # Taken from the docs
> class NormPath(argparse.Action):
> def __call__(self, parser, namespace, values, option_string=None):
> print('%r %r %r' % (namespace, values, option_string))
> setattr(namespace, self.dest, norm_path(values))
>
>
> def parse_args():
> parser = argparse.ArgumentParser()
> parser.add_argument("--config", help="Path to config file.",
> default = "~/.foobar/config", action=NormPath)
>
> return parser.parse_args()
>
>
> This works fine when there is actually a --config=path supplied. But it's
not being applied on default arguments. Of course, I could use "default =
norm_path('~/.foobar/config')" but I expect that custom actions are applied
to default values as well. The store action works alike for default and
supplied values.
>
> What do you think?
Maybe you should specify type rather than action?
$ cat tmp.py
import argparse
p = argparse.ArgumentParser()
p.add_argument("--foo", default="42", type=int)
print(p.parse_args())
$ python3.3 tmp.py --foo=123
Namespace(foo=123)
$ python3.3 tmp.py
Namespace(foo=42)
More information about the Python-list
mailing list