我几乎完成了我的 argparse 任务,已经连续工作了 8 个小时,将提供我到目前为止的代码以及运行时应该做啥[关闭]

Posted

技术标签:

【中文标题】我几乎完成了我的 argparse 任务,已经连续工作了 8 个小时,将提供我到目前为止的代码以及运行时应该做啥[关闭]【英文标题】:I'm almost done with my argparse assignment, have been at this for 8 hours straight, will provide my code so far and what it should do when runs [closed]我几乎完成了我的 argparse 任务,已经连续工作了 8 个小时,将提供我到目前为止的代码以及运行时应该做什么[关闭] 【发布时间】:2021-12-03 08:28:43 【问题描述】:

以下是我应该如何构建程序的说明:

使用 argparse 来实现程序的 CLI 部分,使其按此处所示工作。它是本课程中为数不多的实际打印输出的程序之一。

当您使用 -h 帮助标志时,程序的输出应该与此完全相同。提示:您可以使用 argparse 免费获得 -h 帮助标志。您不必自己实现 -h 标志。

$ python HW3_cli.py -h 用法:HW3_cli.py [-h] [-p] [-c] [-l] texts [texts ...]

位置参数: texts 要操作的输入字符串

可选参数: -h, --help 显示此帮助信息并退出 -p, --print 只打印输入字符串 -c, --combine 打印组合成连续字符串的输入字符串

-l, --len 打印输入字符串的长度

打印、合并,然后是 len。如果没有给出标志,则什么都不做。

看到最后的描述行说明它的作用吗?它是使用 Epilog 创建的。

如果根本没有给出参数,它应该给出一个错误,即需要文本参数。提示:如果你正确编写 texts 参数,你会免费得到这个错误。

$ python HW3_cli.py 用法:HW3_cli.py [-h] [-p] [-c] [-l] texts [texts ...]

HW3_cli.py:错误:需要以下参数:文本

这三个标志的行为解释如下。如果给出了至少一个输入字符串,但没有给出标志,则程序应该什么都不做。由于讲座示例中没有使用标志,因此您需要查看 argparse 文档(查看此处的教程)以了解如何实现标志参数。它们在文档中被称为“短选项”。查找实现 -v "verbose" 选项的示例。

参数

标志参数控制程序做什么。标志可以在命令行上以任何顺序或组合给出,但是,这些是实施规则:它们应该按如下所示的顺序实施 - 换句话说,打印标志(如果给出)首先执行,然后combine 标志(如果给定),然后是 len 标志(如果给定)。请在使用帮助的输出中使所有帮助字符串完全如上所示,如上所示。随意复制/粘贴此文档。

-p 或 --print 标志将打印出输入字符串,每个字符串之间有空格。我们知道如何使用 str 方法之一从字符串列表中创建一个字符串。

-c 或 --combine 标志将打印所有连接在一起的输入字符串。同样,我们知道如何使用字符串方法来做到这一点。

-l 或 --len 标志打印出每个输入字符串的长度。不,您不需要使用 len_safe,因为它们始终是字符串。这有点更具挑战性,但你可以弄清楚! -l 或 --len 的实现选项包括生成器表达式、打印函数的特殊参数等。

这是我的代码运行时的样子:

$ python HW3_cli.py -c 这些字符串被连接起来 这些字符串得到连接 $ python HW3_cli.py -c -p 这些字符串被打印并连接起来 这些字符串被打印并连接起来 这些字符串得到打印和连接 $ python HW3_cli.py -l -c -p 这些字符串被打印并连接起来 这些字符串被打印并连接起来 这些字符串得到打印和连接 5 7 3 7 3 12 $ python HW3_cli.py -c -l --print 这些字符串被打印和连接 这些字符串被打印并连接起来 这些字符串得到打印和连接 5 7 3 7 3 12 $ python HW3_cli.py --len --combine --print 这些字符串被打印和连接 这些字符串被打印并连接起来 这些字符串得到打印和连接 5 7 3 7 3 12 $ python HW3_cli.py --len --combine a b c d e f g abcdefg 1 1 1 1 1 1 1 $ python HW3_cli.py 测试 $ python HW3_cli.py -l 测试 7 美元 python HW3_cli.py -p 测试 测试 $ python HW3_cli.py -c 测试 测试

最后,这是我的代码,然后我将分享我得到的错误:

import argparse
        
if __name__ == "__main__":
    # Set up argparse parser and arguments here
    parser = argparse.ArgumentParser(epilog="Does print, combine, then len. If no flags given, does nothing.")
    # Add the arguments here
    parser.add_argument('texts', help='Input strings to operate on')
    parser.add_argument('-p', '--print', action='store_true', help='Just print the input strings')
    parser.add_argument('-c', '--combine', action='store_true', help='Print input strings combined in a continuous string')
    parser.add_argument('-l', '--len', action='store_true', help='Print the lengths of the input strings')
    args = parser.parse_args()
        
    if args.print:
        words = split(str(args.texts))
        print(" ".join(words))
    if args.combine:
        words2 = split(str(args.texts))
        print("".join(words2))
    if args.len:
        for text in split(str(args.texts)):
            print(len(text))

最后,我得到的错误是: $ python HW3_cli.py -c These Strings Get Concatenated usage: HW3_cli.py [-h] [-p] [-c] [-l] texts HW3_cli.py: 错误:无法识别的参数:字符串得到连接

【问题讨论】:

命令行使用不当:参数值包含空格需要转义或用引号括起来。 包含print(args) 以便于调试 【参考方案1】:

如 cmets 中所述,如果您想为 texts 传递多字输入,则需要将它们用引号括起来,例如 ./script "a b c" -p

但是,这是一种不需要将其括在引号中的方法。这为位置参数texts 指定nargs='*',这是一个贪婪的量词,它匹配您传递给脚本的尽可能多的参数。然后将解析结果作为单词列表传入,因此我们也不需要拆分输入字符串。

import argparse

if __name__ == "__main__":
    # Set up argparse parser and arguments here
    parser = argparse.ArgumentParser(epilog="Does print, combine, then len. If no flags given, does nothing.")
    # Add the arguments here
    parser.add_argument('texts', help='Input strings to operate on',
                        # Add `nargs=*` so we capture as many positional arguments as possible.
                        # The parsed result will be passed in as a list.
                        nargs='*')
    parser.add_argument('-p', '--print', action='store_true', help='Just print the input strings')
    parser.add_argument('-c', '--combine', action='store_true',
                        help='Print input strings combined in a continuous string')
    parser.add_argument('-l', '--len', action='store_true', help='Print the lengths of the input strings')
    args = parser.parse_args()

    if args.print:
        print(" ".join(args.texts))
    if args.combine:
        print("".join(args.texts))
    if args.len:
        # prints output on a single line, separated by spaces
        print(*map(len, args.texts))
        # alternatively, if you want output on each line:
        # for text in args.texts:
        #     print(len(text))

示例用法:

$ python script.py -lcp These Strings Get Printed And Concatenated
These Strings Get Printed And Concatenated
TheseStringsGetPrintedAndConcatenated
5 7 3 7 3 12

【讨论】:

非常感谢您,先生/女士!所以我需要添加一个 nargs='*' 来告诉它接受每个参数!哇!谢谢!那么这是否意味着我一直在告诉我的程序我的文本 nargs 是 None 类型?无论如何,你很棒!所以我想我必须研究如何将地图与 Python 一起使用!我们还没有进入那个阶段!谢谢你给了我高深的知识! 没问题!是的,如果未传递此参数,我相信默认行为将是 nargs=None。在这种情况下,它只会读取第一个参数,例如给定输入 hello world,它将读取第一个参数 (hello) 并停止,因为它将第二个单词解释为单独的参数。 是的,map 内置函数非常酷,在这种情况下似乎很有用。我也测试过,你也可以使用列表理解,然后打印*[len(text) for text in args.texts],它做同样的事情。星号* 运算符解包列表,因此print(*[1, 2, 3]) 变为print(1, 2, 3)

以上是关于我几乎完成了我的 argparse 任务,已经连续工作了 8 个小时,将提供我到目前为止的代码以及运行时应该做啥[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

福尔摩斯 argparse 模块任务

解析多个文件 argparse

argparse - 请求已经给出的参数

执行永无止境的任务的正确方法。 (计时器与任务)

我已经过滤了我的 Excel 数据,现在我想给行编号。我怎么做?

运行多个异步任务并等待它们全部完成