using optparser

jimgardener jimgardener at gmail.com
Sat Oct 16 22:59:46 EDT 2010


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




More information about the Python-list mailing list