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)
Другие вопросы по тегам