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