Python argparse с несколькими действиями в одном аргументе
Я пытаюсь решить проблему с помощью функции argparse в Python
Я хотел бы добиться, чтобы при задании аргумента -k было установлено значение по умолчанию (скажем, 5), однако, если задано -k=3, то теперь k содержит 3...
Вот пример:
python3 test.py -k
Пространство имен (к ==5)
python3 test.py -k=3
Пространство имен (к ==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 ответа
Как насчет этого:
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')
Это что-то вроде хака, но вы можете заменить все знаки равенства в аргументах пробелами, а затем использовать 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)