目前我的代码看起来像这样。它允许我解析程序脚本获得的多个参数。是否有更接近“最佳实践”的方式?我没有看到实际使用argparse
输出的代码,只是如何设置它。
def useArguments():
x = 0
while x <= 5:
if x == 0:
if args.getweather != None:
getWeather(args.getweather)
if x == 1:
if args.post != None:
post(args.post)
if x == 2:
if args.custompost != None:
custompost(args.custompost)
if x == 3:
if args.list != None:
listAccounts(args.list)
if x == 4:
if args.add != None:
addAccount(args.add[0])
if x == 5:
if args.edit != None:
editAccount(args.edit[0])
x = x + 1
if __name__ == '__main__':
updateConfig()
parser = argparse.ArgumentParser(description='Post Yahoo weather to Twitter.', epilog="Report any bugs to example@email.com", prog='Program')
parser.add_argument('-a', '--add', nargs=1, help='Add a new account. Use the desired account name as an argument.')
parser.add_argument('-e', '--edit', nargs=1, choices=accountListSTR[:-1], help='Edit an account. Use the desired account name as an argument.')
parser.add_argument('-g', '--getweather', nargs='*', choices=accountListSTR, help='Get weather and post here. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
parser.add_argument('-p', '--post', nargs='*', choices=accountListSTR, help='Post weather to Twitter. Specify account(s) as argument. Use "all" for all accounts. If you specify multiple accounts, separate by a space NOT a comma.')
parser.add_argument('-c', '--custompost', nargs=2, help='Post a custom message. Specify an account then type the message. Make sure you use "" around the message. Use "all" for all accounts.')
parser.add_argument('-l', '--list', action='store_const', const='all', help='List all accounts.')
parser.add_argument('--version', action='version', version='%(prog)s 0.3.3')
args = parser.parse_args()
useArguments()
答案 0 :(得分:11)
您可以为参数提供自定义action,并引用:
传递实现该对象的对象 动作API。最简单的方法 是扩展argparse.Action, 提供适当的
__call__
方法。__call__
方法应该 接受四个参数:
- 解析器:包含此操作的ArgumentParser对象。
- 命名空间:
parse_args()
将返回的命名空间对象。大多数操作都会向此对象添加属性。- 值:关联的命令行参数,应用了任何类型转换。(类型转换使用
add_argument()
的type关键字参数指定。- option_string :用于调用此操作的选项字符串。 option_string参数是可选的,如果操作与位置参数相关联,则该参数将不存在。
醇>
答案 1 :(得分:6)
请参阅http://docs.python.org/library/argparse.html#sub-commands:
处理子命令的一种特别有效的方法是将
add_subparsers()
方法的使用与对set_defaults()
的调用结合起来,以便每个子分析器知道它应该执行哪个Python函数。
简而言之:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
weather_parser = subparsers.add_parser('get-weather')
weather_parser.add_argument('--bar')
weather_parser.set_defaults(function=get_weather) # !
args = parser.parse_args(['get-weather', '--bar', 'quux'])
print args.function(args)
在这里,我们为命令get-weather
创建一个subparser,并为其分配函数get_weather
。
请注意,文档说关键字/属性名为func
,但从argparse 1.1开始它肯定是function
。
结果代码有点过于冗长,所以我发布了一个简单的小包"argh",例如:
parser = argparse.ArgumentParser()
add_commands(parser, [get_weather])
print dispatch(parser, ['get-weather', '--bar', 'quux'])
“Argh”可以做得更多,但我会让堆栈溢出回答。 : - )
答案 2 :(得分:4)
除--version
(通常是一种选项)外,您提供的操作最好不要视为“子命令”。
我没有意识到argparse的细节,因为我还没有尝试过Python 2.7,但你可以看一下svn
命令作为例子,这里是命令行的一些伪代码:
myprog [--version] <command> [<command opts>...]
<command>
位于:
add|edit|getweather|post|custompost|list
<command opts>
是特定于该命令的选项。使用optparse(类似),这意味着当调用args
时,您的命令将在parse_args
中返回,允许您执行以下操作:
opts, args = parser.parse_args()
if opts.version:
...
else:
getattr("do_" + args[0])(*args[1:])
我发现这种模式对于调试特别有用,我从命令行提供对内部函数的访问,并传递各种参数进行测试。根据您自己的项目调整命令处理程序的选择。