如何使用 argparse 让用户更改现有程序的输出?
How to use argparse to let user make changes to output of existing program?
我有一个程序可以生成一组数据并将其打印得非常好。我寻求解决方案的挑战如下:
- 在打印之前将数组中的数据弄乱,例如,插入
非 UTF-8 字符,字段顺序错误,
更改日期格式。
- 让用户选择 "muck ups" 发生。
这是我现有程序的精简版本,我希望拦截并破坏其输出:
ex_matrix = [[402, 'Mayonnaise', '0123', 2014-12-18, '(Burlington, -, -)', 1.0],
[413, 'Peanuts', '0177', 2014-11-10, '(Place, Florida, South Afrika)', 1.0],
[415, 'Seaweed', '0713', 2014-12-02, '(The Pub, -, Newfoundland)', 1.0]]
def print_forecasts(matrix, num_rows):
for r in xrange(num_rows):
print("{%s, [%s, %s, %s, %s], %s}" % (matrix[r][0], matrix[r][1],
matrix[r][2], matrix[r][3], matrix[r][4], matrix[r][5]))
print "# Generated using pickles_program.py \n"
def main():
print_forecasts(ex_matrix, 3)
main()
根据我对 Python 的 argparse tutorial, the PEP re. argparse 和几个 Whosebug 答案的阅读,argparse 似乎是这个问题的关键。这是我写的,只是想了解 argparse 的工作原理:
import argparse
num_rows = 3
parser = argparse.ArgumentParser(description="base rate model: error adder")
parser.add_argument("muck2", help="muck up the population field", nargs='?')
args = parser.parse_args()
for i in xrange(num_rows):
matrix[i][1] = "^&*#$)(*DJJJJ)"
print matrix
将有 10 种以上的模型供用户选择。我想我希望用户能够对命令行说 "python pickles_program.py 1 3 8 11," 或类似的东西,并让 muck-up 的 1、3、8 和 11 发生,并且 "python pickles_program.py --help" 显示所有的 muck-up 选项。
如果这是一个愚蠢的问题,我希望你能原谅我。我是一个 Python 新手,仍在学习如何使用许多资源来学习这门伟大的语言,但我搜索了 SO 和 Python 文档的高低——请相信我,如果那里有我的问题的答案,它要么没有为像我这样的人解释得足够好,要么太难找到了,因为我还没有找到它。
请指教,尤其是。关于如何清楚地提出我的问题better/more!
在我看来,将 "muck ups" 作为标志而不是数字来处理会容易得多。然后,您可以使用 ArgParse 检查是否启用了这些标志。例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print "verbosity turned on"
这样,通过 parser.add_argument("argument", action="store_true") 添加所有 "muck ups",然后对每个 "muck up" 执行逻辑一系列 if 语句。
为了您的学习目的,最好在没有任何额外模块的情况下开始。直接从 sys.argv
开始工作。例如
import sys
muck_ups = []
if sys.argv[1:]: # values beyond the program name
muck_ups = [int(i) for i in sys.argv[1:]]
# this will throw an error if one of the strings can't be converted to an int
# we can refine that later
if len(muck_ups)==0:
print('help...')
sys.exit(1)
# print help if they don't give you any numbers
for m in muck_ups:
if m in [1]:
pass # do one muckup
elif m in [2]:
<do another>
elif m in [3]:
<etc>
else:
print('muckup %s not found'%m)
muck_ups
值不必是数字。它们可以是字符串,你可以有别名,例如
elif m in [1,'1','one','first']:
....
如果您想按照 muck_ups
值指示的顺序执行操作,请使用这样的逻辑。如果你想做 action1
if 1 in muck_ups
,然后 action2
if 2 in muck_ups:
,等等,你会想使用不同的逻辑
一个简单的 argparse
解析器:
parser.add_argument('muck_ups', type=int, nargs='*')
会在 args.muck_ups
中给出相同的整数列表。如果你想添加更多的开关和选项,argparse
会很有用,但对于像这样的一个参数,它并没有太大的区别。
argparse
(和相关模块)主要是一种解析输入的方式;弄清楚用户想要做什么。它不是一种执行机制。并且不要因为让它做一些花哨的事情而挂断电话。
我有一个程序可以生成一组数据并将其打印得非常好。我寻求解决方案的挑战如下:
- 在打印之前将数组中的数据弄乱,例如,插入 非 UTF-8 字符,字段顺序错误, 更改日期格式。
- 让用户选择 "muck ups" 发生。
这是我现有程序的精简版本,我希望拦截并破坏其输出:
ex_matrix = [[402, 'Mayonnaise', '0123', 2014-12-18, '(Burlington, -, -)', 1.0],
[413, 'Peanuts', '0177', 2014-11-10, '(Place, Florida, South Afrika)', 1.0],
[415, 'Seaweed', '0713', 2014-12-02, '(The Pub, -, Newfoundland)', 1.0]]
def print_forecasts(matrix, num_rows):
for r in xrange(num_rows):
print("{%s, [%s, %s, %s, %s], %s}" % (matrix[r][0], matrix[r][1],
matrix[r][2], matrix[r][3], matrix[r][4], matrix[r][5]))
print "# Generated using pickles_program.py \n"
def main():
print_forecasts(ex_matrix, 3)
main()
根据我对 Python 的 argparse tutorial, the PEP re. argparse 和几个 Whosebug 答案的阅读,argparse 似乎是这个问题的关键。这是我写的,只是想了解 argparse 的工作原理:
import argparse
num_rows = 3
parser = argparse.ArgumentParser(description="base rate model: error adder")
parser.add_argument("muck2", help="muck up the population field", nargs='?')
args = parser.parse_args()
for i in xrange(num_rows):
matrix[i][1] = "^&*#$)(*DJJJJ)"
print matrix
将有 10 种以上的模型供用户选择。我想我希望用户能够对命令行说 "python pickles_program.py 1 3 8 11," 或类似的东西,并让 muck-up 的 1、3、8 和 11 发生,并且 "python pickles_program.py --help" 显示所有的 muck-up 选项。
如果这是一个愚蠢的问题,我希望你能原谅我。我是一个 Python 新手,仍在学习如何使用许多资源来学习这门伟大的语言,但我搜索了 SO 和 Python 文档的高低——请相信我,如果那里有我的问题的答案,它要么没有为像我这样的人解释得足够好,要么太难找到了,因为我还没有找到它。
请指教,尤其是。关于如何清楚地提出我的问题better/more!
在我看来,将 "muck ups" 作为标志而不是数字来处理会容易得多。然后,您可以使用 ArgParse 检查是否启用了这些标志。例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print "verbosity turned on"
这样,通过 parser.add_argument("argument", action="store_true") 添加所有 "muck ups",然后对每个 "muck up" 执行逻辑一系列 if 语句。
为了您的学习目的,最好在没有任何额外模块的情况下开始。直接从 sys.argv
开始工作。例如
import sys
muck_ups = []
if sys.argv[1:]: # values beyond the program name
muck_ups = [int(i) for i in sys.argv[1:]]
# this will throw an error if one of the strings can't be converted to an int
# we can refine that later
if len(muck_ups)==0:
print('help...')
sys.exit(1)
# print help if they don't give you any numbers
for m in muck_ups:
if m in [1]:
pass # do one muckup
elif m in [2]:
<do another>
elif m in [3]:
<etc>
else:
print('muckup %s not found'%m)
muck_ups
值不必是数字。它们可以是字符串,你可以有别名,例如
elif m in [1,'1','one','first']:
....
如果您想按照 muck_ups
值指示的顺序执行操作,请使用这样的逻辑。如果你想做 action1
if 1 in muck_ups
,然后 action2
if 2 in muck_ups:
,等等,你会想使用不同的逻辑
一个简单的 argparse
解析器:
parser.add_argument('muck_ups', type=int, nargs='*')
会在 args.muck_ups
中给出相同的整数列表。如果你想添加更多的开关和选项,argparse
会很有用,但对于像这样的一个参数,它并没有太大的区别。
argparse
(和相关模块)主要是一种解析输入的方式;弄清楚用户想要做什么。它不是一种执行机制。并且不要因为让它做一些花哨的事情而挂断电话。