我想将传递给 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/