根据另一个参数的值添加参数

2 投票
2 回答
2520 浏览
提问于 2025-04-18 12:57

根据其中一个输入,我想初始化某些对象。这些对象的值将作为其余参数的默认值。所以我需要在调用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()

总的来说,这种方法需要你避免(或者至少要知道后果)那些会产生副作用的选项处理器,因为它们会被触发两次。

撰写回答