gpt4 book ai didi

python - argparse:展平操作结果 ='append'

转载 作者:太空狗 更新时间:2023-10-29 18:26:10 35 4
gpt4 key购买 nike

我想制作一个支持表单参数列表的脚本

./myscript --env ONE=1,TWO=2 --env THREE=3

这是我的尝试:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--env',
type=lambda s: s.split(','),
action='append',
)
options = parser.parse_args()
print options.env

$ ./myscript --env ONE=1,TWO=2 --env THREE=3
[['ONE=1', 'TWO=2'], ['THREE=3']]

当然我可以在后处理中解决这个问题:

options.env = [x for y in options.env for x in y]

但我想知道是否有某种方法可以直接从 argparse 中获取展平列表,这样我就不必在添加新内容时在脑海中保留“之后我需要展平的东西”列表程序选项。

如果我使用 nargs='*' 而不是 type=lambda...,同样的问题也适用。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--env',
nargs='+',
action='append',
)
options = parser.parse_args()
print options.env

$ ./myscript --env ONE=1 TWO=2 --env THREE=3
[['ONE=1', 'TWO=2'], ['THREE=3']]

最佳答案

编辑: Since Python 3.8, the "extend" is available directly in stdlib 。如果您只需要支持 3.8+,则不再需要自己定义它。标准库“扩展”操作的用法与最初描述的答案完全相同:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('--env', nargs='+', action='extend')
>>> parser.parse_args(["--env", "ONE", "TWO", "--env", "THREE"])
Namespace(env=['ONE', 'TWO', 'THREE'])

不幸的是,默认情况下,ArgumentParser 中没有提供extend 操作。但是注册一个并不难:

import argparse

class ExtendAction(argparse.Action):

def __call__(self, parser, namespace, values, option_string=None):
items = getattr(namespace, self.dest) or []
items.extend(values)
setattr(namespace, self.dest, items)


parser = argparse.ArgumentParser()
parser.register('action', 'extend', ExtendAction)
parser.add_argument('--env', nargs='+', action='extend')

args = parser.parse_args()
print(args)

演示:

$ python /tmp/args.py --env one two --env three
Namespace(env=['one', 'two', 'three'])

示例中的 lambda 在某种程度上超出了 type kwarg 的预期用例。因此,我建议改为按空格拆分,因为正确处理 , 实际上在数据中的情况会很痛苦。如果您拆分空间,您可以免费获得此功能:

$ python /tmp/args.py --env one "hello world" two --env three
Namespace(env=['one', 'hello world', 'two', 'three'])

关于python - argparse:展平操作结果 ='append',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41152799/

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