gpt4 book ai didi

python - argparse:将参数与另一个参数相关联

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:00 25 4
gpt4 key购买 nike

使用 argparse,可以重复一个参数并将所有值收集到一个列表中:

parser = ArgumentParser()
parser.add_argument('-o', '--output', action='append')

args = parser.parse_args(['-o', 'output1', '-o', 'output2'])
print(vars(args))
# {'output': ['output1', 'output2']}

我正在寻找一种方法将标志与这些参数中的每一个相关联,以便可以这样做:

args = parser.parse_args(['-o', 'output1', '--format', 'text',
'-o', 'output2', '--format', 'csv'])

并得到这样的输出(或类似的东西):

{'output': {'output1': {'format': 'text'},
'output2': {'format': 'csv'}
}
}

理想情况下,这些标志应遵循通常的语义 - 例如,--format 可以是可选的,或者可以有多个参数与每个 -o 输出相关联,在这种情况下,它们应该可以按任何顺序通过(即 -o output1 -a -b -c 应该等同于 -o output1 -c -a -b)。

这可以用 argparse 完成吗?

最佳答案

3 个解析器在一组通用的 -o-f 标志上运行:

简单追加 - 2 个 dest 之间没有连接:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', action='append')
parser.add_argument('-f', '--format', action='append')

args = parser.parse_args(['-o', 'output1', '-o', 'output2'])
print(args)
args = parser.parse_args(['-o', 'output1', '--format', 'text',
'-o', 'output2', '--format', 'csv'])
print(args)

args = parser.parse_args(['-o', 'output1',
'-o', 'output2', '--format', 'csv',
'-o', 'output3', '-f1', '-f2'])
print(args)
print()

nargs='+';将参数放在一起,但不使用 format 标志:

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', action='append', nargs='+')
#parser.add_argument('-f', '--format', action='append')

args = parser.parse_args(['-o', 'output1', '-o', 'output2'])
print(args)
args = parser.parse_args(['-o', 'output1', 'text',
'-o', 'output2', 'csv'])
print(args)

args = parser.parse_args(['-o', 'output1',
'-o', 'output2', 'csv',
'-o', 'output3', '1', '2'])
print(args)
print()

append 类派生的自定义类。为每个 output 创建一个字典。 format 修改最后一个output 字典:

class Foo1(argparse._AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
items = argparse._copy.copy(argparse._ensure_value(namespace, self.dest, []))
dd = {'output': values, 'format': []}
items.append(dd)
setattr(namespace, self.dest, items)

class Foo2(argparse._AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
items = argparse._copy.copy(argparse._ensure_value(namespace, self.dest, []))
last = items[-1] # error if -f before -o
last['format'].append(values)
setattr(namespace, self.dest, items)

parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', action=Foo1)
parser.add_argument('-f', '--format', action=Foo2, dest='output')

args = parser.parse_args(['-o', 'output1', '-o', 'output2'])
print(args)
args = parser.parse_args(['-o', 'output1', '--format', 'text',
'-o', 'output2', '--format', 'csv'])
print(args)

args = parser.parse_args(['-o', 'output1',
'-o', 'output2', '--format', 'csv',
'-o', 'output3', '-f1', '-f2'])
print(args)
print()

产生:

1238:~/mypy$ python stack48504770.py 
Namespace(format=None, output=['output1', 'output2'])
Namespace(format=['text', 'csv'], output=['output1', 'output2'])
Namespace(format=['csv', '1', '2'], output=['output1', 'output2', 'output3'])

Namespace(output=[['output1'], ['output2']])
Namespace(output=[['output1', 'text'], ['output2', 'csv']])
Namespace(output=[['output1'], ['output2', 'csv'], ['output3', '1', '2']])

Namespace(output=[{'output': 'output1', 'format': []},
{'output': 'output2', 'format': []}])
Namespace(output=[{'output': 'output1', 'format': ['text']},
{'output': 'output2', 'format': ['csv']}])
Namespace(output=[{'output': 'output1', 'format': []},
{'output': 'output2', 'format': ['csv']},
{'output': 'output3', 'format': ['1', '2']}])
()

关于python - argparse:将参数与另一个参数相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48504770/

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