Currently my code looks like this. It allows me to parse multiple parameters my program script gets. Is there a different way that is closer to 'best practices'? I haven't seen code actually using the output of argparse
, only how to set it up.
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()
You could supply a custom action for an argument by, and I quote:
With the exception of
--version
, which is very commonly an option, the actions you've provided are better off treated as "subcommands".I'm unaware of the argparse specifics, as I have yet to try Python 2.7, but you might take a look at the
svn
command as an example, here's some pseudocode for the command line:Where
<command>
in:And
<command opts>
are options specific to that command. Using optparse (which is similar), this would mean that your command would be returned inargs
, when callingparse_args
, allowing you to do something like this:I find this pattern particularly useful for debugging, where I'd provide access to internal functions from the command line, and pass various arguments for testing. Adjust the selection of the command handler as appropriate for your own project.
See http://docs.python.org/library/argparse.html#sub-commands:
In a nutshell:
Here we create a subparser for the command
get-weather
and assign the functionget_weather
to it.Note that the documentation says that the keyword/attribute is named
func
but it's definitelyfunction
as of argparse 1.1.The resulting code is a bit too wordy so I've published a small package "argh" that makes things simpler, e.g.:
"Argh" can do more but I'll let stack overflow answer that. :-)