I want to convert arguments I pass to argparse in an other format; the idea is to pass a number (a float typically) and to convert it in a string (Fortran notation for a float, typically).
First, I tried to create a custom type
def FortranFloat(value):
vfloat = float(value)
vfloat = str(vfloat) + "d0"
return vfloat
parser = argparse.ArgumentParser()
parser.add_argument("--xmin=", dest="xmin", type=FortranFloat, default=-2.0)
args = parser.parse_args()
It works well... if I actually give the --xmin=
argument. Else, it just keeps the -2.0
, without converting it in -2.0d0
as I wish. I therefore thought that it could be easier to give the default value the format I want, so replacing 2.0
by '2.0d0'
... The interesting thing is that it is evaluated, because it crashes and raise the following error
argparse.ArgumentError: argument --xmin=: invalid FortranFloat value: '-2.0d0'
To get around this problem I tried to create a custom action
class FortranConverter(argparse.Action):
def __call__(self, parser, namespace, values, option_strings=None):
if type(values) is float:
values = str(values) + "d0"
setattr(args, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument("--xmin=", dest="xmin", type=float, default=-2.0, action=FortranConverter)
args = parser.parse_args()
That didn't work either. It doesn't even seem to go through my action (if I print something in the __call__
, it will just ignore it).
Any thought, idea or explanation would be appreciated!
If the default
is a string, it is passed through the type
function. Anything else is used as is: setattr(namespace, dest, default)
. Have you tried '-2.0'? Your FortranFloat
should convert that to '-2.0d0'.
Another option is to modify your FortranFloat
so it recognizes a string with 'd0', and passes it through unchanged.
The argument string is passed through type
before it is passed to the action
. And if I recall the code correctly, a default
never goes through the action
; it is set directly.
You don't need it, but to work, your FortranConverter
function should use setattr(namespace, self.dest, values)
.
What were you trying to accomplish with nargs=0
? Actions like 'store_true' use that to indicated that they don't take any arguments. Otherwise it isn't a useful value for the programmer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With