6

when I accept arguments how do I check if two show up at the same time without having a compound conditional

i.e.

#!/usr/bin/python
import random, string
import mymodule
import sys

z = ' '.join(sys.argv[2:])
q = ''.join(sys.argv[3:])
a = ''.join(sys.argv[2:])
s = ' '.join(sys.argv[1:])
flags = sys.argv[1:5]

commands = [["-r", "reverse string passed next with no quotes needed."], ["-j", "joins arguments passed into string. no quotes needed."], ["--palindrome", "tests whether arguments passed are palindrome or not. collective."],["--rand","passes random string of 10 digits/letters"]]

try:
    if "-r" in flags:
        if "-j" in flags:
            print mymodule.reverse(q)
        if not "-j" in flags:
            print mymodule.reverse(z)

    if "-j" in flags:
        if not "-r" in flags:
            print a

    if "--palindrome" in flags: mymodule.ispalindrome(z)

    if (not "-r" or not "-j" or not "--palindrome") in flags: mymodule.say(s)

    if "--rand" in flags: print(''.join([random.choice(string.ascii_letters+"123456789") for f in range(10)]))

    if not sys.argv[1]: print mymodule.no_arg_error

    if "--help" in flags: print commands

except: print mymodule.no_arg_error

i just want to be able to say

if "-r" and "-j" in flags in no particular order: do whatever

cheseaux
  • 5,187
  • 31
  • 50
tekknolagi
  • 10,663
  • 24
  • 75
  • 119

3 Answers3

7

Something like

import optparse

p = optparse.OptionParser()
p.add_option('--foo', '-f', default="yadda")
p.add_option('--bar', '-b')
options, arguments = p.parse_args()

# if options.foo and options.bar ...
Bjorn
  • 5,272
  • 1
  • 24
  • 35
  • what does "default" do? just curious how I would incorporate that – tekknolagi Jan 09 '11 at 23:11
  • new to python, not programming – tekknolagi Jan 09 '11 at 23:12
  • and optparse seems to be deprecated so i'll go with getopt? – tekknolagi Jan 09 '11 at 23:12
  • 1
    p.add_option('--year', '-y', default='2011'). -> blah.py --year 2010. – Bjorn Jan 09 '11 at 23:13
  • optparse is deprecated, but argparse is only introduced in 2.7. OS X, for example, runs 2.6 by default. If you are sure your audience is not on 2.6 anymore, you should go with argparse. Otherwise I'd recommend to stay with optparse, because it'll work on both 2.6 and 2.7. – Bjorn Jan 09 '11 at 23:16
  • From the doumentation: "Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the *argparse* module". `getopt` would be a step backwards. – johnsyweb Jan 13 '11 at 02:49
4

I'd recommend using argparse for this (or optparse if you're on Python 2.6.x or older).

Without a module you'd do this:

if "-r" in flags and "-j" in flags:
    do whatever

But I suggest you read the documentation for argparse and learn how to use it. You will be happy you did.

Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
0

Also see getopt. It has a bit more terse syntax, and a complete example in docs.

9000
  • 39,899
  • 9
  • 66
  • 104
  • what do you mean by terse syntax? – tekknolagi Jan 09 '11 at 23:06
  • With optparse, you generally `add_option()` for each option. With getopt, you just write something like `options, fnames = getopt("abf:")` and this handles `-a`, `-b` and `-f filename`. – 9000 Jan 10 '11 at 01:31