我想把传递给argparse的参数转换成另一种格式;其思想是传递一个数字(通常是浮点数)并将其转换为字符串(通常是浮点数的Fortran表示法)。
首先,我尝试创建一个自定义类型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()
效果很好…如果我给出--xmin=
的参数。否则,它只保留-2.0
,而不像我希望的那样将其转换为-2.0d0
。因此,我认为将默认值设置为我想要的格式会更容易,因此用'2.0d0'
替换2.0
…有趣的是,它是求值的,因为它崩溃并引发以下错误
argparse.ArgumentError: argument --xmin=: invalid FortranFloat value: '-2.0d0'
为了解决这个问题,我尝试创建一个自定义动作
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()
那也没用。它甚至没有经过我的动作(如果我在__call__
中打印一些东西,它会忽略它)。
任何想法,想法或解释将不胜感激!
如果default
是字符串,则通过type
函数传递。其他任何东西都按setattr(namespace, dest, default)
使用。你试过"-2.0"吗?您的FortranFloat
应该将其转换为'-2.0d0'。
另一个选择是修改你的FortranFloat
,这样它就可以识别带有'd0'的字符串,并将其不加更改地传递给它。
参数字符串在传递给action
之前先传递给type
。如果我没记错的话,default
不会经过action
;可直接设置
你不需要它,但是为了工作,你的FortranConverter
函数应该使用setattr(namespace, self.dest, values)
。
你想用nargs=0
完成什么?像'store_true'这样的操作使用它来表明它们不接受任何参数。