解析多个位置参数的问题

Posted

技术标签:

【中文标题】解析多个位置参数的问题【英文标题】:Issue parsing multiple positional arguments 【发布时间】:2021-02-18 01:06:37 【问题描述】:

我一定遗漏了一些非常明显的东西,但我终生无法发现它。

import argparse


def parse_args():
    parser = argparse.ArgumentParser(description="Copies selected files.")
    parser.add_argument(
        "-c", "--checksum", type=bool, default=False
    )
    parser.add_argument("source")
    parser.add_argument("target")
    return parser.parse_args()


def main():
    args = parse_args()
    print(args.checksum, args.source, args.target)


main()

>python file_proc.py source1 target1
False source1 target1

到目前为止,一切都很好。

>python file_proc.py -c source1 target1
usage: file_proc.py [-h] [-c CHECKSUM] source target
file_proc.py: error: the following arguments are required: target

现在,为什么不输出True source1 target1?它一定就在我面前,但我需要另一双眼睛。

谢谢!

【问题讨论】:

type 参数应该是一个函数,它将输入字符串转换为所需的值。如果您想将诸如“yes”或“no”之类的字符串解释为True/False booleans,则必须自己编写。 【参考方案1】:

您的编码方式基本上意味着,如果您传递 -c,那么您还需要在 args 中传递 bool

因此你的陈述:

>python file_proc.py source1 target1
False source1 target1

工作正常,因为您没有通过-c。所以,它打印了False

但是当你在命令行中传递-c 时,它需要另一个变量作为参数传递。这样做:

>python file_proc.py -c d source1 target1
True source1 target1

这意味着 bool 作为参数传递,因此它打印 True

【讨论】:

【参考方案2】:

--checksum 的参数声明意味着-c/--checksum 之后传入一个实际的布尔值。例如,--checksum yes 将“启用”校验和;由于bool 解释字符串的方式,任何 参数而不是空字符串的计算结果为True

使用store_true/store_false action 定义一个无参数标志,通过被提及来打开/关闭。

    parser.add_argument(
        "-c", "--checksum", action='store_true'
    )

【讨论】:

我知道这是基本的东西!它是一个开关参数,所以我确实需要action='store_true'。谢谢!

以上是关于解析多个位置参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

argparse 仅在位置参数之前解析

Argparse - 子解析器中位置参数之前的可选参数

golang 命令行参数解析 hflag

AWS CDK - 多个堆栈 - 找不到 Lambda 代码位置的参数

有没有办法在 Eloquent 的同一个查询中使用相同的参数到多个位置?

如何使 argparse 将所有参数视为位置?