gpt4 book ai didi

Python argparse 用于无限数量的输入和需要多个参数的标志?

转载 作者:行者123 更新时间:2023-12-01 02:36:46 49 4
gpt4 key购买 nike

我有一个 Python 库,用户当前通过它运行

python main.py

main.py会调用同一目录下的其他*.py脚本,程序运行完成。

我的问题是,这个软件的用户应该能够输入(理论上)无限数量的“事件”,用户需要具体的4条信息:“类别”(字符串),“类型”(字符串) )、“开始时间”(整数)和“结束时间”(整数)。默认情况下,如果没有任何标志,则不使用任何“事件”,并且程序默认运行。用户必须为每个“事件”同时提供 4 个参数中的每一个,否则会出现错误消息。用户应该能够根据需要安排尽可能多的“事件”。

目前,我不确定允许用户使用 argparse 传递参数变量的最佳方式,其中 (1) 他们可以一次传递数十个参数,并且 (2 ) 需要 4 个类别。这可能吗?使用的数据结构是什么,通过 argparse 的字典?

对于只有一个这样的输入,最简单的方法可能是使用 argparse,并强制用户使用以下格式

python main.py ---user_specify "category1", 1233, 1452, 1673

main.py 脚本中我有类似的内容

 import argparse
parser = argparse.ArgumentParser()
parser.add_argument("user_specify", action="store_true", default=False)

这实在是太笨拙了。更大的问题是它没有解决允许用户传递数十个此类参数的问题。

正确的Pythonic方法是什么?

可以通过字典传递吗?但是,如何使用相同的 argparse 标志来处理多个输入呢?

最佳答案

In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: parser.add_argument('-e','--event',action='append',nargs=4)

In [5]: args = parser.parse_args('--event cetegory1 123 2 4 -e cat2 23 4 343'.split())
In [6]: args
Out[6]: Namespace(event=[['cetegory1', '123', '2', '4'], ['cat2', '23', '4', '343']])

每个 --event 标志标记一个包含 4 个项目的新列表。后解析代码可以迭代 args.event 的子列表并将最后 2 个元素转换为整数。

如果用引号引起来,字符串也可以包含空格。

对于许多此类“事件”,您可以将它们放入 @file 中,如

中所述

https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars

如果使用https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args中的想法

该文件可能看起来像

--event cetegory1 123 2 4 
-e "cat 2" 23 4 343
--event foo bar 4 2
...

类似的数据也可以作为 csv 文件读取。解析 json 字符串也是一种选择。带有 type=json.loads 参数的 argparse 参数可以从输入或 @file 中读取这样的字符串。

In [7]: import json
In [8]: parser.add_argument('-j',type=json.loads)
In [9]: argv = ['-j', '[["category1","123",3,4]]']
In [10]: parser.parse_args(argv)
Out[10]: Namespace(event=None, j=[['category1', '123', 3, 4]])

关于Python argparse 用于无限数量的输入和需要多个参数的标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134615/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com