python argparse 多参数处理

python argparse multiple arguments processing

初学者。在 argparse 上需要一些帮助。下面是代码。

#!/usr/bin/python

import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument('-a', '--add', help="input the data in format ip:port:name", nargs='*') 
p.add_argument('-d', '--delete', help="input the data in format ip:port:name", nargs='*') 
args = p.parse_args()
add_List = args.add 
del_List = args.delete

addN = "adding.."
delN = "deleting.."

def test(what):
    for i in range(5):
        print what

######### expected output: "adding.." 5 times 
for i in add_List:
    test(addN)

######### expected output: "deleting.." 5 times 
for i in deL_List:
    test(delN)

我基本上想要的是,当脚本是 运行 时,

  1. ./script -a 1.1.1.1:99:na1 it should print "adding.." 5 times
  2. ./script -d 1.1.1.1:99:na1 it should print "deleting.." 5 times

请不要介意脚本中给出的参数,因为它们将被单独处理。我只想了解在这样的场景中使用带有适当条件的 argparse 的最有效方法。此外,如果我也能打印出一份合理的使用指南,那就太好了。

在我看来,这只是一个错字。在第 26 行 del_list 而不是 del_List.

#!/usr/bin/python

import argparse
import re
import string

p = argparse.ArgumentParser()
p.add_argument('-a', '--add', help="input the data in format ip:port:name", nargs='*')
p.add_argument('-d', '--delete', help="input the data in format ip:port:name", nargs='*')
args = p.parse_args()
add_List = args.add or [] #['192.168.1.10:80:name1', '172.25.16.2:100:name3']
del_List = args.delete or [] #['192.168.1.10:80:name1', '172.25.16.2:100:name3']

addN = "adding.."
delN = "deleting.."

def test(what):
    for i in range(5):
        print(what)

######### expected output: "adding.." 5 times
for i in add_List:
    test(addN)

######### expected output: "deleting.." 5 times
for i in del_List:
    test(delN)

输出

adding..
adding..
adding..
adding..
adding..
deleting..
deleting..
deleting..
deleting..
deleting..

参数

--delete 123 --add 456

当我第一次 运行 你发布的代码时,我得到

1550:~/mypy$ python stack43690807.py -a 1.1.1.1:99:na1
adding..
adding..
adding..
adding..
adding..
Traceback (most recent call last):
  File "stack43690807.py", line 23, in <module>
    for i in deL_List:
NameError: name 'deL_List' is not defined

如果我更正错字(大写 L)

1819:~/mypy$ python stack43690807.py -a 1.1.1.1:99:na1
adding..
adding..
adding..
adding..
adding..
Traceback (most recent call last):
  File "stack43690807.py", line 23, in <module>
    for i in del_List:
TypeError: 'NoneType' object is not iterable

这里的问题是默认是Nonefor i in None: 不起作用。所以我们要么需要测试 None,例如

if add_List is not None:
   for i in add_List:
   ....

或者我们需要将默认值更改为 default=[]。此外,我还添加了一个 print(args) 语句,因此我们可以更清楚地了解解析器生成的内容。

1819:~/mypy$ python stack43690807.py -a 1.1.1.1:99:na1
Namespace(add=['1.1.1.1:99:na1'], delete=[])
adding..
adding..
adding..
adding..
adding..
1820:~/mypy$ python stack43690807.py -d 1.1.1.1:99:na1
Namespace(add=[], delete=['1.1.1.1:99:na1'])
deleting..
deleting..
deleting..
deleting..
deleting..

import argparse


p = argparse.ArgumentParser()
p.add_argument('-a', '--add', help="input the data in format ip:port:name", nargs='*', default=[])
# add default parameter
p.add_argument('-d', '--delete', help="input the data in format ip:port:name", nargs='*', default=[])
args = p.parse_args()
print(args)
add_List = args.add #['192.168.1.10:80:name1', '172.25.16.2:100:name3']
del_List = args.delete #['192.168.1.10:80:name1', '172.25.16.2:100:name3']

addN = "adding.."
delN = "deleting.."

def test(what):
    for i in range(5):
        print what

######### expected output: "adding.." 5 times
for i in add_List:
    test(addN)

######### expected output: "deleting.." 5 times
for i in del_List:     # <== correct typo
    test(delN)