我想转换以其他格式传递给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.0
替换为'2.0d0'
...有趣的是它被评估,因为它崩溃并引发以下错误
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__
中打印某些内容,它将忽略它)。
任何想法,想法或解释都将不胜感激!
答案 0 :(得分:6)
如果default
是一个字符串,它将通过type
函数传递。其他任何内容都按原样使用:setattr(namespace, dest, default)
。你试过' -2.0&#39 ;?您的FortranFloat
应将其转换为' -2.0d0'。
另一种选择是修改您的FortranFloat
,以便识别带有' d0'的字符串,并将其传递给未更改。
参数字符串在传递给type
之前通过action
传递。如果我正确地回忆起代码,default
永远不会通过action
;它是直接设置的。
您不需要它,但要工作,您的FortranConverter
功能应使用setattr(namespace, self.dest, values)
。
你想用nargs=0
做些什么?像' store_true'这样的操作用它来表示他们不接受任何争论。否则它对程序员来说不是一个有用的值。