Python argparse 一个参数多个动作
我正在尝试解决一个关于Python中argparse函数的问题。
我想实现的是,如果指定了-k这个参数,它的默认值应该是5;但是如果设置了-k=3,那么'k'的值就变成3了……
这里有个例子:
python3 test.py -k
Namespace(k==5)
python3 test.py -k=3
Namespace(k==3)
这样做有可能吗?
test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-k ', metavar='n', type=int, default=5, dest='number')
args = parser.parse_args()
print(args)
提前谢谢你!
2 个回答
0
这有点像小技巧,但你可以把所有参数中的等号替换成空格,然后再用argparse来处理这些参数。如果你还想继续使用argparse,比如处理其他参数,这样做可能会更好。
这样的话,-k=3和-k 3都能正常工作。不过,-k=3=-k=4=-k也会被解析,没有错误。
这个方法是参考jmunsch的回答改编的:
import argparse
import sys
# split all args with equal sign
args = []
for arg in sys.argv[1:]:
args.extend(arg.split('='))
# parse the args
parser = argparse.ArgumentParser()
parser.add_argument('-k', metavar='n', type=int, dest='number',
action='append', nargs='?', const=5)
args = parser.parse_args(args)
print(args.number[0])
我们可以让这个方法更聪明一点,只对以'-k='开头的参数进行拆分:
# split all args with equal sign
args = []
for arg in sys.argv[1:]:
if arg[:2] == '-k=':
args.extend(arg.split('='))
else:
args.append(arg)
1
这个怎么样:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-k',metavar='n', dest='number', action='append', nargs='?', const=5)
args = parser.parse_args()
print(args.number[0])
'python3 test.py -k' 的输出是:
5
'python3 test.py -k=3' 的输出是:
3
一个使用 sys
的例子:
import sys
k = 5
for opt in sys.argv:
if opt.split('=')[0] == '-k':
if '=' in opt:
print(opt.split('=')[1])
if '=' not in opt:
print(k)
elif len(sys.argv) is 1:
print('No arguments were supplied')