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

MBR*_*MBR 4 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()
Run Code Online (Sandbox Code Playgroud)

它运作良好......如果我真的给出了--xmin=论点.否则,它只是保留-2.0,而不是-2.0d0按照我的意愿转换它.因此我认为可以更容易地给出我想要的格式的默认值,所以替换2.0'2.0d0'...有趣的是它被评估,因为它崩溃并引发以下错误

argparse.ArgumentError: argument --xmin=: invalid FortranFloat value: '-2.0d0'
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我尝试创建自定义操作

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()
Run Code Online (Sandbox Code Playgroud)

那也行不通.它似乎甚至没有经历我的行动(如果我在其中打印一些东西__call__,它将忽略它).

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

hpa*_*ulj 6

如果default是一个字符串,它将通过该type函数传递.其他任何东西都按原样使用:setattr(namespace, dest, default).你试过'-2.0'吗?你FortranFloat应该将其转换为'-2.0d0'.

另一种选择是修改你的,FortranFloat以便识别带有'd0'的字符串,并将其传递给不变.

参数字符串type在传递给之前传递action.如果我正确地回忆起代码,那么default永远不会通过action; 它直接设置.

你不需要它,但要工作,你的FortranConverter功能应该使用setattr(namespace, self.dest, values).

你想要完成nargs=0什么?像'store_true'这样的动作用来表明它们不带任何参数.否则,它对程序员来说不是一个有用的值.