使用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.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'这样的操作使用它来表明它们不接受任何参数。

最新更新