【问题标题】:Python: argparse.ArgumentParser() - overriding global defaultsPython:argparse.ArgumentParser() - 覆盖全局默认值
【发布时间】:2020-07-31 23:18:57
【问题描述】:

我有一个程序执行 3 个任务的情况,其中有相应的 3 个 可选 参数。 如果 3 个参数中没有传递,则 执行所有 3 个任务。 但是,如果有任何参数被特别提到,那么只做那些任务!

浏览文档后,我想出了一个解决方案,但觉得这不是最短或有效的方法。

argparse文档中,我使用store_false实现了

my_parser.add_argument('-a', action='store_false')
my_parser.add_argument('-b', action='store_false')
my_parser.add_argument('-c', action='store_false')

但是我必须使用以下逻辑来实现我的要求。 说是否指定了任务 ac 的参数。所以,我们不应该做任务b


a = False
b = True
c = False

l = [a,b,c]

if all(l):
    print("Do All 3 tasks")
else:
    if not a:
        print('Do task A ')
    if not b:
        print('Do task B')
    if not c:
        print('Do task C')
> python3 arg_check.py 
Do task A 
Do task C

但我相信这么多代码?

argparse 库中有没有更好的方法,可以根据任何其他参数覆盖其他参数的值?

【问题讨论】:

  • 我在你的问题中没有看到argparse相关的代码,你需要添加一下
  • 一些if 声明没有错。 argparse 应该主要被视为一种解析工具——用户想要什么。从该输入简化执行是次要的。

标签: python argparse


【解决方案1】:

您可以使用一个接受不同数量值的参数,而不是指定 3 个不同的参数。然后,您可以为所有任务设置默认值,并且方便地此参数将是一个列表,因此您可以对其进行迭代。比如:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('tasks', nargs='*', default=['a', 'b', 'c'])
args = parser.parse_args()
for task in args.tasks:
    print(task, end=' ')

运行示例:

>>> arg_check.py
a b c 
>>> arg_check.py a c
a c

【讨论】:

    【解决方案2】:

    将默认设置为“”(空字符串)并将选项设置为['A','B','C'],还将操作设置为'store_true'。检查其中设置了哪一个。您可以通过检查 args.'optional_argument_name' 来获取设置并执行该特定任务。如果可选参数设置为 "" 你可以为它做一个任务。还将 nagrs 设置为“*”,这意味着它需要 0 个或更多参数。

    parser = argparse.ArgumentParser('simple-check')
    parser.add_argument(
        "-c","--check",
        help="select from choices",
        choices=['A','B','C'],
        nargs="*",
        action="store_true",
        default=""
    ) 
    
    args = parser.parse_args()
    
    if args.check == "":
        # do a task
    elif args.check == "A":
        # do a task
    elif args.check == "B":
        # do a task
    elif args.check == "C":
        # do a task
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多