【问题标题】:Python Argparse: Arguments Within Optional ArgumentsPython Argparse:可选参数中的参数
【发布时间】:2019-07-12 08:52:13
【问题描述】:

我正在编写一个脚本,它可以执行多项操作,具体取决于传递到命令行的参数。例如:

#changed and simplified from actual code
parser.add_argument('-a','--apple')
parser.add_argument('-b','--boy')
parser.add_argument('-c', '--car')
parser.add_argument('-d', '--dog')
args = parser.parse_args()

我只想要命令行中的 1 个参数。因此,只会接受-a,-b,-c,-d 中的一个,然后代码将根据传递的任何参数执行。

我可以通过一系列 if 语句来做到这一点,比如

if args.a:
if args.b:

等等。有没有更好的方法来解决这个问题?

对于每个命令行选项 (-a,-b,-c,-d),我希望传入一些参数。这些参数将是特定的,并且会根据初始命令行选项而有所不同。例如:

python test.py -a apple aardvark aquaman

我考虑过使用nargs,但我不知道如何使每个参数都是

  1. 以正确的顺序和
  2. 需要的参数。在上面的示例中,假设额外可选参数的数量为 3,我想确保所有参数都以字母 a 开头。

我该如何处理?

【问题讨论】:

    标签: python command-line-arguments argparse optional-arguments


    【解决方案1】:

    您可以使用add_mutually_exclusive_group() 定义互斥选项:

    group = parser.add_mutually_exclusive_group()
    group.add_argument('-a','--apple')
    group.add_argument('-b','--boy')
    group.add_argument('-c', '--car')
    group.add_argument('-d', '--dog')
    args = parser.parse_args()
    

    关于第二部分,您可以指定nargs 和自定义typetype 可以简单地是一个接受参数字符串的函数:

    def check_a(val):
        if not val or not val[0] == 'a':
            raise argparse.ArgumentTypeError('Must be a value starting with a')
        return val
    
    parser.add_argument('-a', '--apple', nargs=3, type=check_a)
    

    关于传递给选项appleAFAIK 的参数的顺序,您必须事后检查:

    args = parser.parse_args()
    if is_wrong_order(args.apple):
        parser.error('Incorrect argument order to apple')
    

    无论如何,在您的情况下,您可能希望使用 subparsers 而不是选项。

    【讨论】:

    • 谢谢!我会试试这个。快速提问,当您执行“type=check_a”时,为什么当函数需要参数“val”时不传入参数?
    • 另外,另一个问题。我对 argparse 的一切都很陌生。您将如何访问 check_a 的返回值?会是类似 args.apple.type() 的东西吗?
    • @helloworld95 我将函数作为参数传递,我没有调用它。 argparse 将调用该函数并将返回值作为列表存储在 args.apple 中,正如您在我的上一个示例中看到的那样。
    猜你喜欢
    • 2017-11-28
    • 2019-11-17
    • 2017-01-14
    • 1970-01-01
    • 2021-01-07
    • 2023-04-02
    • 2019-01-28
    • 2021-05-06
    相关资源
    最近更新 更多