如何使用 python 的 argparse 基于参数创建条件参数?

How to create conditonal arguments based on arguments using python's argparse?

我正在尝试创建小型命令行工具。我的方法是从我想要 运行 的命令列表开始,然后创建一个解析器来容纳这些命令。而不是设置解析器然后决定输入应该是什么。

我正在努力弄清楚如何根据以前的输入设置参数。以下是我的目标命令的几个示例。

cgen create test-runner
cgen create config --branch branch_name
cgen create guide --branch branch_name

我目前已将其设置为 create 已将选项设置为参数。然后,根据输入的参数,如果 configguide[=25,我想让 branch 成为必需的参数=] 是 运行,但如果输入 test-运行ner 则不是。

我一直在拆解并尝试不同的方法,所以我目前拥有的东西非常基础,但看起来像这样......

def main():
    def run_create(args):
        print('run_create')
        if args.create_type == 'test-runner':
            create_test_runner(args)
        if args.create_type == 'config':
            print(f'Creating config')
        if args.create_type == 'guide':
            print(f'Creating guide')
    
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # create the parser for the "create" command
    parser_create = subparsers.add_parser('create')
    parser_create.add_argument(choices=['test-runner', 'config', 'guide'], dest='create_type')
    parser_create.set_defaults(func=run_create)
    args = parser.parse_args()

    args.func(args)

添加参数时,您可以指定是否需要它们link

这样您就可以即时进行测试并强制进行论证。

 def arguments_is_given(*args: str) -> bool:
        return len(set(args) & set(sys.argv)) > 0

def main():
    def run_create(args):
        print('run_create')
        if args.create_type == 'test-runner':
            create_test_runner(args)
        if args.create_type == 'config':
            print(f'Creating config')
        if args.create_type == 'guide':
            print(f'Creating guide')
    
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # create the parser for the "create" command
    parser_create = subparsers.add_parser('create')
    parser_create.add_argument("--branch",required=not arguments_is_given("config", "guide"))
parser_create.add_argument(choices=['test-runner', 'config', 'guide'], dest='create_type')
    parser_create.set_defaults(func=run_create)
    args = parser.parse_args()

    args.func(args)