using optparser

Chris Hulan chris.hulan at gmail.com
Sun Oct 17 06:13:16 CEST 2010


On Oct 16, 10:59 pm, jimgardener <jimgarde... at gmail.com> wrote:
> hi
> I have a program which I call  findmatch that expects these arguments
> 1.a person name
> 2.a group name
> 3.an integer
> 4.a float value
>
> I thought I would allow user to call this program either using options
> or using positional arguments in a predefined order
> ie,
> findmatch  -f schoolmates -i jon -t 3.5 -n 115
> or
> findmatch jon schoolmates 115 3.5
>
> I tried to code this using optparser..
>
> def parse_arguments():
>     usage = """usage: %prog [options]
>     eg:
>     findmatch -i jon -f schoolmates   -n 115 -t 3.5
>     """
>     parser = OptionParser(usage)
>
>     parser.add_option('-i','--person',dest='personname',help='person
> to be matched')
>     parser.add_option('-f','-group',dest='groupname', help='group
> containing people to be tested against')
>     parser.add_option('-n','--
> num',dest='samplenumber',type='int',help='how many samples to be used
> ')
>     parser.add_option('-t','--
> cutoff',dest='cutoff',type='float',help='some upperlimit ')
>
>     options,args = parser.parse_args()
>
>     def check_if_person_name_valid(name):
>         if not person_exists(name):
>             parser.error('you must give an valid person name')
>     def check_if_group_name_valid(name):
>         if not group_exists(name):
>             parser.error('you must give a valid group')
>
>     if not options.personname or not options.groupname:
>         print parser.format_help()
>         parser.exit()
>     check_if_person_name_valid(options.personname)
>     check_if_group_name_valid(options.groupname)
>
>     return options
>
> iif __name__=='__main__':
>     options = parse_arguments()
>     person_name = options.personname
>     group = options.groupname
>     number_of_samples_to_use = options.samplenumber
>     cutoff = options.cutoff
>     msg = 'You are trying to match {0} against group {1} using {2}
> samples \
> and using {3:2.2f} as the upper limit '
>     print msg.format(person_name ,  group , number_of_samples_to_use ,
> cutoff )
>
> This can handle keyword arguments.But if I have to allow a user to
> input arguments without options
> ie
> findmatch jon schoolmates 115 3.5
>
> can I do this in the above method? If user enters the above line ,the
> options instance would have
> {  'personname': None ,'groupname': None ...}
> and
> args will contain a list of positional arguments .
>
> I am not sure how this can be processed so that a user is given
> freedom to choose either.
> Any suggestions most welcome.
> regards,
> jim

You could check if args has 4 elements, assuming they are the
positional args just assign them to the options
Or you could check the command line to see if there are any items
starting with '-', and then proceed accordingly.



More information about the Python-list mailing list