gpt4 book ai didi

带有编号参数名称的 Python argparse

转载 作者:行者123 更新时间:2023-12-05 06:02:31 30 4
gpt4 key购买 nike

GNU grep 有一个参数可以在匹配行周围打印一定数量的额外行。从手册页:

-C NUM, -NUM, --context=NUM Print NUM lines of output context. Places a line containing a group separator (--) between contiguous groups ofmatches. With the -o or --only-matching option, this has no effect anda warning is given.

所以我可以做类似的事情

grep -5 pattern file.txt

相当于

grep -C 5 pattern file.txt

我如何使用 argparse 模拟 -NUMBER 行为到用户可以传入 -NUM 的位置,我可以从 argparse 轻松获取该数字。

一个愚蠢的做法是做这样的事情:

parser = argparse.ArgumentParser()
for i in range(1, 10000):
parser.add_argument(f'-{i}', action='store_true', dest=f'border_lines_{i}', help=argparse.SUPPRESS)

args = parser.parse_args()

border_line_count = 0
for i in range(1, 10000):
if getattr(args, f'border_lines_{i}'):
border_line_count = i
break

基本上,我为不同的 -NUM 添加了一堆隐藏参数。然后找到设置的那个。有没有更好的办法?

最佳答案

这是一种方法,但我个人不喜欢。

parser.add_argument('-', dest='border_lines')

将为您提供所需的基本行为。请注意,这是一个必需的参数,如果您希望它成为一个可选参数,您可以:

parser.add_argument('-', dest='border_lines', default=0)

现在的一个(奇怪的)问题是它只接受个位数。要解决此问题,您需要定义并覆盖解析操作。

 class ConcatAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string):
value = int(''.join(values))
setattr(namespace, 'border_lines', value)

现在您可以将其用作:

parser = argparse.ArgumentParser()
parser.add_argument('-', dest='border_lines', default=0, nargs='*', action=ConcatAction)
parser.parse_args('-555') # Gives Namespace(border_lines=555)

我强烈认为这会与其他参数混淆,我还没有测试过。我再说一遍,我不喜欢这种方式,遵循 python zen,我们应该明确(使用 arg 名称)并尽可能清楚。

关于带有编号参数名称的 Python argparse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66898230/

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