python - 使用 argparse 对默认参数的自定义类型或操作

标签 python argparse

我想将传递给 argparse 的参数转换成另一种格式;这个想法是传递一个数字(通常是 float )并将其转换为字符串(通常是 float 的 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__ 中打印一些东西,它只会忽略它)。

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

最佳答案

如果 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”之类的操作使用它来表示它们不接受任何参数。否则它对程序员来说不是有用的值。

关于python - 使用 argparse 对默认参数的自定义类型或操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23833488/

相关文章:

python - 如何将一个位置参数包含到 argparse 互斥组中?

python - 使用 unittest discover 传递参数(对于 argparse)

python - 捕获未知的魔法方法调用?

python - 在 Hugging Face BertForSequenceClassification 中有 6 个标签而不是 2 个

python - 为什么 Code Runner 在 OSX 上使用旧的 2.71 版本的 Python 而不是 3.x?

python - 当从命令行传入时,是否有一种Python式的方式为变量赋值?

Python argparse - 禁用子命令的帮助?

python - Django:如何订购查询集并将一些项目移动到查询集的末尾

python - 在 Pandas 数据框中的每一行中找到非零值的列索引集

python - 不要在 argparse 的 print_help() 中两次显示长选项