解析命令行输入中的数字
我正在写一个命令行应用,希望用户能够输入数字,可以是单个数字,也可以是一个范围。比如说:
$ myapp -n 3,4,5,6
或者
$ myapp -n 3-6
我希望我的应用能把这些数字放进一个Python列表里,比如说:[3, 4, 5, 6]。我现在在用optparse
,但不太确定怎么从这两种输入方式创建列表。如果能给点示例代码就太好了。
编辑
我还希望能够输入多个范围:
$ myapp -n 22-27, 51-64
5 个回答
2
你可以定义你的参数,然后使用optparse 回调函数来处理你的输入,处理完再保存:
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]
3
如果你在一个字符串中有多个参数(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]
15
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]
产生