使用其中一个位置参数的值作为其中一个可选参数的默认值

时间:2014-01-22 20:39:30

标签: python argparse

在主题中,我想

import argparse
parser = argparse.ArgumentParser()
parser.add_argument( "input" )
args = parser.parse_args() # <--- breaks if one of the optional arguments given
parser.add_argument( "-o", "--output", action="store", default=args.input+".out" )
parser.add_argument( "-s", "--skip-fields", action="store", default=1 )
args = parser.parse_args()

可能的解决方案可能是在声明可选参数之前插入args = parser.parse_args(),但如果实际给出了任何可选参数,它会破坏代码。

可以吗?

2 个答案:

答案 0 :(得分:2)

也许你可以给可选参数一个默认的None或类似的东西,然后在后面的参数处理中替换它?

import argparse
parser = argparse.ArgumentParser()
parser.add_argument( "input" )
parser.add_argument( "-o", "--output", action="store", default=None)
args = parser.parse_args()

if args.output is None:
    args.output = args.input+".out"
print args

您甚至可以省略default=None,因为default的{​​{3}}为None

快速测试:

In [2]: run test.py my_filename
Namespace(input='my_filename', output='my_filename.out')

答案 1 :(得分:1)

将第一个parse_args替换为

args,rest = parser.parse_known_args()

现在parser处理input,但忽略了其余部分(实际上将其放在rest中)。

但是,在完成argparse后有条件地设置默认值也应该可以正常工作。从概念上讲,它可以更简单。

想想在出现错误时您想看到什么,或者您寻求帮助。是否需要设置默认值?