根据另一个参数的值添加参数
根据其中一个输入,我想初始化某些对象。这些对象的值将作为其余参数的默认值。所以我需要在调用parser.parse_args()之前就获取其中一个参数的值。我该如何使用Python的argparse模块来实现这个呢?所有选项都会在一行命令中给出。
默认值应该在帮助信息中显示。这些值来自对象。
def cli():
option1 = None
parser = argparse.ArgumentParser()
parser.add_argument('--option1', help=argparse.SUPPRESS)
#option1 = value from --option1
abc(option1)
parser.add_argument('--option2', default=abc.getValue())
args = parser.parse_args()
我该如何实现这个?
2 个回答
0
为了让代码更易读和逻辑更清晰,牺牲一些不必要的选项是值得的。
如果你在选项解析器完成之前就试图从 sys.argv
中取出东西(这正是你想要的),那么看到代码的人会想:“他为什么要这么做?这不合理。”
我建议这样做(基于 @Geekfish 的评论):
import argparse
def get_option2(option1, option2):
if option2 is not None: # The user specified an option
return option2
else: # The user did not specify an option
option2 = abc(option1).getValue() # set option2 based on option1
return option2
parser = argparse.ArgumentParser()
parser.add_argument('--option1', help=argparse.SUPPRESS)
parser.add_argument('--option2', default=None)
args = parser.parse_args()
option2 = get_option2(args['option1'], args['option2'])
2
这个方法虽然不是最有效率的,但你可以在定义完选项1后,解析一下已知的选项,然后再把选项2加到解析器里,再次进行解析。
def cli():
option1 = None
parser = argparse.ArgumentParser()
parser.add_argument('--option1', help=argparse.SUPPRESS)
args, remaining = parser.parse_known_args()
abc(args.option1)
parser.add_argument('--option2', default=abc.getValue())
args = parser.parse_args()
总的来说,这种方法需要你避免(或者至少要知道后果)那些会产生副作用的选项处理器,因为它们会被触发两次。