Python argparse 一个参数多个动作

3 投票
2 回答
3877 浏览
提问于 2025-04-18 00:35

我正在尝试解决一个关于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')

撰写回答