【发布时间】:2015-10-24 01:02:54
【问题描述】:
我有一个通过命令行获取命名参数的脚本。可以多次提供参数之一。比如我想运行一个脚本:
./script.py --add-net=user1:10.0.0.0/24 --add-net=user2:10.0.1.0/24 --add-net=user3:10.0.2.0/24
现在我想要一个 argparse 动作来解析每个参数并将结果存储在一个字典中,例如:
{ 'user1': '10.0.0.0/24',
'user2': '10.0.1.0/24',
'user3': '10.0.2.0/24' }
如果没有提供值,还应该提供一个默认值。喜欢
./script.py
应该有这样的dict:
{'user': '192.168.0.0/24'}
我相信我必须为 argparse 构建一个自定义操作。我想出的是:
class ParseIPNets(argparse.Action):
"""docstring for ParseIPNets"""
def __init__(self, option_strings, dest, nargs=None, **kwargs):
super(ParseIPNets, self).__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
for value in values:
location, subnet = values.split(':')
namespace.user_nets[location] = subnet
parser = argparse.ArgumentParser(description='foo')
parser.add_argument('--add-net',
nargs='*',
action=ParseIPNets,
dest='user_nets',
help='Nets subnets for users. Can be used multiple times',
default={"user1": "198.51.100.0/24"})
args = parser.parse_args()
当我需要使用默认值时效果很好:
test.py
Namespace(user_nets={'user1': '198.51.100.0/24'})
但是,当我添加参数时 - 它们被附加到默认值。我的期望是它们应该被添加到一个空的字典中:
test.py --add-net=a:10.0.0.0/24 --add-net=b:10.1.0.0/24
Namespace(user_nets={'a': '10.0.0.0/24', 'b': '10.1.0.0/24', 'user1': '198.51.100.0/24'})
达到我需要的正确方法是什么?
【问题讨论】:
-
您为什么认为它们会被添加到空字典中?你提供了一个可变的论点;如果用户没有提供任何东西,也许将其作为后续步骤会更好?
-
这正是我犯的错误。 @serge-ballesta 提供的解决方案就像一个魅力。