使用argparse对默认参数进行自定义类型或操作

时间:2014-05-23 15:45:45

标签: python argparse

我想转换以其他格式传递给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__中打印某些内容,它将忽略它)。

任何想法,想法或解释都将不胜感激!

1 个答案:

答案 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'这样的操作用它来表示他们不接受任何争论。否则它对程序员来说不是一个有用的值。