Разбор ввода командной строки для чисел - PullRequest
9 голосов
/ 18 января 2011

Я пишу приложение для командной строки и хотел бы, чтобы пользователь мог вводить числа как отдельные числа или как диапазон. Так, например:

$ myapp -n 3,4,5,6

или

$ myapp -n 3-6

Я бы хотел, чтобы мое приложение поместило их в список Python, например, [3, 4, 5, 6] Я использую optparse, но не уверен, как создать список из этих двух стилей ввода. Некоторый пример кода был бы великолепен.

EDIT

Я бы тоже хотел иметь возможность вводить несколько диапазонов:

$ myapp -n 22-27, 51-64

Ответы [ 5 ]

14 голосов
/ 18 января 2011
import argparse

def parse_range(astr):
    result = set()
    for part in astr.split(','):
        x = part.split('-')
        result.update(range(int(x[0]), int(x[-1]) + 1))
    return sorted(result)

parser = argparse.ArgumentParser()
parser.add_argument('-n', type=parse_range)
args = parser.parse_args()
print(args.n)

выходы

% script.py -n 3-6
[3, 4, 5, 6]

% script.py -n 3,6
[3, 6]

% script.py -n 22-27,51-64 
[22, 23, 24, 25, 26, 27, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64]
3 голосов
/ 18 января 2011

Если у вас есть n-arg в строке, вы можете сделать:

def f(s):
    if '-' in s:
        i = s.index('-')
        return range(*map(int, s.split('-')))
    return map(int, s.split(','))

Некоторые примеры:

In [3]: s = '1, 2, 3, 4, 5, 6'

In [4]: f(s)
Out[4]: [1, 2, 3, 4, 5, 6]

In [5]: f('3-6')
Out[5]: [3, 4, 5]

In [6]: f('3-16-3')
Out[6]: [3, 6, 9, 12, 15]
2 голосов
/ 18 января 2011

Вы можете определить свой аргумент и использовать optparse callback для обработки ввода перед его сохранением:

from optparse import OptionParser

parser = OptionParser()

def create_range_callback(option, opt, value, parser):
    i, j = map(int, value.split('-'))
    setattr(parser.values, option.dest, range(i, j+1))

parser.add_option("-r", "--range", action="callback", 
                  callback=create_range_callback, 
                  type="string", dest='list')

(options, args) = parser.parse_args()

print options.list

сейчас:

python2.7 test.py -r 1-5

Выход:

[1, 2, 3, 4, 5]
1 голос
/ 18 января 2011

Вы можете использовать библиотеку optparse .

Пример:

from optparse import OptionParser

opt_parser = OptionParser(version="%prog 0.1")
opt_parser.usage = '%prog [options]\n\nTCP protocol reengineering tool'

# Options
opt_parser.add_option('-n', default="1,2,3")
(options, args) = opt_parser.parse_args()

list = []
for s in options.n.split(","):
    list.append(int(s))
1 голос
/ 18 января 2011

Использовать Функция диапазона Python .Проанализируйте введенные пользователем данные, разделив их по символу «-», а затем передайте эти параметры в диапазон.

Ваш код может выглядеть примерно так:

parameters = input.split('-')
completeRange = range(int(parameters[0]), int(parameters[1]))

Если они вводят отдельные числа, вы можете легко разобрать это в список.

...