multiple parameters in if statement

Discussion in 'Python' started by Kun, Apr 16, 2006.

  1. Kun

    Kun Guest

    I am trying to make an if-statement that will not do anything and print
    'nothing entered' if there is nothing entered in a form. I have the
    following code that does that, however, now even if I enter something
    into the form, the code still outputs 'nothing entered'. This violates
    the if statement and I am wondering what I did wrong.

    if form.has_key("delete_id") and form["delete_id"].value != "" and
    form.has_key("delete_date") and form["delete_date"].value != "" and
    form.has_key("delete_purchasetype") and
    form["delete_purchasetype"].value != "" and form.has_key("delete_price")
    and form["delete_price"].value != "" and form.has_key("delete_comment")
    and form["delete_comment"].value != "":
    delete_id=form['delete_id'].value
    delete_date=form['delete_date'].value
    delete_purchasetype=form['delete_purchasetype'].value
    delete_price=form['delete_price'].value
    delete_comment=form['delete_comment'].value
    else:
    print "ERROR: Nothing entered!"
    raise Exception
    Kun, Apr 16, 2006
    #1
    1. Advertising

  2. On Sat, 15 Apr 2006 20:28:47 -0400, Kun wrote:

    > I am trying to make an if-statement that will not do anything and print
    > 'nothing entered' if there is nothing entered in a form. I have the
    > following code that does that, however, now even if I enter something
    > into the form, the code still outputs 'nothing entered'. This violates
    > the if statement and I am wondering what I did wrong.
    >
    > if form.has_key("delete_id") and form["delete_id"].value != "" and
    > form.has_key("delete_date") and form["delete_date"].value != "" and
    > form.has_key("delete_purchasetype") and
    > form["delete_purchasetype"].value != "" and form.has_key("delete_price")
    > and form["delete_price"].value != "" and form.has_key("delete_comment")
    > and form["delete_comment"].value != "":
    > delete_id=form['delete_id'].value
    > delete_date=form['delete_date'].value
    > delete_purchasetype=form['delete_purchasetype'].value
    > delete_price=form['delete_price'].value
    > delete_comment=form['delete_comment'].value
    > else:
    > print "ERROR: Nothing entered!"
    > raise Exception



    That's rather, um, unfortunate looking code.

    Instead of making lots of tests like this:

    if form.has_key(key) and form[key].value != "" ...

    you might find it useful to create a helper function:

    def get(form, key):
    if form.has_key(key):
    return form[key].value
    else:
    return ""

    Now you don't need to test for existence and non-emptiness, because
    missing values will be empty. You just use it like this:

    if get(form, key) != "" and ...


    Using the get helper function, your test becomes much simpler:

    if get(form, "delete_id") != "" and get(form, "delete_date") != "" \
    and get(form, "delete_purchasetype") != "" and \
    get(form, "delete_price") != "" and get(form, "delete_comment") != "":
    do_something()
    else:
    raise ValueError("nothing entered")

    But that's still too complicated. In Python, every object can be
    tested by if...else directly. Strings are all True, except for the empty
    string, which is False.

    As an experiment, try this:

    if "something":
    print "Something is not nothing."
    else:
    print "Empty string."

    if "":
    print "Something is not nothing"
    else:
    print "Empty string."


    So your if...else test becomes simpler:

    if get(form, "delete_id") and get(form, "delete_date") and \
    get(form, "delete_purchasetype") and get(form, "delete_price") and \
    get(form, "delete_comment"):
    do_something()
    else:
    raise ValueError("nothing entered")


    Now your test checks that every field is non-empty, and if so, calls
    do_something(), otherwise it raises an error.

    But in fact, that gets the logic backwards. You want to raise an error
    only if every field is empty. So your test becomes:

    if get(form, "delete_id") or get(form, "delete_date") or \
    get(form, "delete_purchasetype") or get(form, "delete_price") or \
    get(form, "delete_comment"):
    do_something()
    else:
    raise ValueError("nothing entered")




    --
    Steven.
    Steven D'Aprano, Apr 16, 2006
    #2
    1. Advertising

  3. Kun

    John Machin Guest

    On 16/04/2006 10:28 AM, Kun wrote:
    > I am trying to make an if-statement that will not do anything and print
    > 'nothing entered' if there is nothing entered in a form. I have the
    > following code that does that, however, now even if I enter something
    > into the form, the code still outputs 'nothing entered'. This violates
    > the if statement and I am wondering what I did wrong.
    >
    > if form.has_key("delete_id") and form["delete_id"].value != "" and


    Unless your code needs to run on Python 2.1, consider using the <key> in
    <dict> construct instead of <dict>.has_key(<key>) -- it's not only less
    wear and tear on the the eyeballs and fingers, it's faster.

    Python 2.1.3 (#35, Apr 8 2002, 17:47:50) [MSC 32 bit (Intel)] on win32
    >>> foo = {}; foo['bar'] = 'zot'
    >>> foo.has_key('bar')

    1
    >>> 'bar' in foo

    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    TypeError: 'in' or 'not in' needs sequence right argument
    >>>


    Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32
    >>> foo = {}; foo['bar'] = 'zot'
    >>> foo.has_key('bar')

    1
    >>> 'bar' in foo

    1
    >>>
    John Machin, Apr 16, 2006
    #3
  4. Kun

    John Zenger Guest

    Try this:

    if form.get("delete_id","") != "" and form.get("delete_data","") != ""
    and...

    the "get" method lets you have an optional second argument that gets
    returned if the key is not in the dictionary.

    Also, am I reading your code right? If I enter some fields but not all,
    you print a message that says "Nothing entered." Nothing?

    The other thing I'd recommend is stick that long list of fields in a
    list, and then do operations on that list:

    fields = ['delete_id', 'delete_date', 'delete_purchasetype',
    'delete_price', 'delete_comment']

    then to see if all those fields are empty:

    everything = ""
    for field in fields:
    everything += form.get(field,"")
    if everything == "":
    print "Absolutely nothing entered!"

    Kun wrote:
    > I am trying to make an if-statement that will not do anything and print
    > 'nothing entered' if there is nothing entered in a form. I have the
    > following code that does that, however, now even if I enter something
    > into the form, the code still outputs 'nothing entered'. This violates
    > the if statement and I am wondering what I did wrong.
    >
    > if form.has_key("delete_id") and form["delete_id"].value != "" and
    > form.has_key("delete_date") and form["delete_date"].value != "" and
    > form.has_key("delete_purchasetype") and
    > form["delete_purchasetype"].value != "" and form.has_key("delete_price")
    > and form["delete_price"].value != "" and form.has_key("delete_comment")
    > and form["delete_comment"].value != "":
    > delete_id=form['delete_id'].value
    > delete_date=form['delete_date'].value
    > delete_purchasetype=form['delete_purchasetype'].value
    > delete_price=form['delete_price'].value
    > delete_comment=form['delete_comment'].value
    > else:
    > print "ERROR: Nothing entered!"
    > raise Exception
    >
    John Zenger, Apr 16, 2006
    #4
  5. Kun

    John Machin Guest

    On 16/04/2006 1:43 PM, John Zenger wrote:
    >
    > The other thing I'd recommend is stick that long list of fields in a
    > list, and then do operations on that list:
    >
    > fields = ['delete_id', 'delete_date', 'delete_purchasetype',
    > 'delete_price', 'delete_comment']
    >
    > then to see if all those fields are empty:
    >
    > everything = ""
    > for field in fields:
    > everything += form.get(field,"")


    Or everything = "".join(form.get(field, "") for field in fields)

    Somewhat labour-intensive. It appears from the OP's description that no
    other entries can exist in the dictionary. If this is so, then:

    everything = "".join(form.values())

    but what the user sees on screen isn't necessarily what you get, so:

    everything = "".join(form.values()).strip()

    > if everything == "":
    > print "Absolutely nothing entered!"
    >
    John Machin, Apr 16, 2006
    #5
  6. Kun

    John Zenger Guest

    Yup, join is better. The problem with using form.values() is that it
    will break if the HTML changes and adds some sort of new field that this
    function does not care about, or if an attacker introduces bogus fields
    into his query.

    John Machin wrote:
    > On 16/04/2006 1:43 PM, John Zenger wrote:
    >
    >>
    >> The other thing I'd recommend is stick that long list of fields in a
    >> list, and then do operations on that list:
    >>
    >> fields = ['delete_id', 'delete_date', 'delete_purchasetype',
    >> 'delete_price', 'delete_comment']
    >>
    >> then to see if all those fields are empty:
    >>
    >> everything = ""
    >> for field in fields:
    >> everything += form.get(field,"")

    >
    >
    > Or everything = "".join(form.get(field, "") for field in fields)
    >
    > Somewhat labour-intensive. It appears from the OP's description that no
    > other entries can exist in the dictionary. If this is so, then:
    >
    > everything = "".join(form.values())
    >
    > but what the user sees on screen isn't necessarily what you get, so:
    >
    > everything = "".join(form.values()).strip()
    >
    >> if everything == "":
    >> print "Absolutely nothing entered!"
    >>
    John Zenger, Apr 16, 2006
    #6
  7. Kun

    John Machin Guest

    On 17/04/2006 5:13 AM, John Zenger top-posted:
    > Yup, join is better. The problem with using form.values() is that it
    > will break if the HTML changes and adds some sort of new field that this
    > function does not care about, or if an attacker introduces bogus fields
    > into his query.


    If one is worried about extra keys introduced by error or malice, then
    one should check for that FIRST, and take appropriate action. Code which
    is concerned with the values attached to the known/valid keys can then
    avoid complications caused by worrying about extra keys.

    >
    > John Machin wrote:
    >> On 16/04/2006 1:43 PM, John Zenger wrote:
    >>
    >>>
    >>> The other thing I'd recommend is stick that long list of fields in a
    >>> list, and then do operations on that list:
    >>>
    >>> fields = ['delete_id', 'delete_date', 'delete_purchasetype',
    >>> 'delete_price', 'delete_comment']
    >>>
    >>> then to see if all those fields are empty:
    >>>
    >>> everything = ""
    >>> for field in fields:
    >>> everything += form.get(field,"")

    >>
    >>
    >> Or everything = "".join(form.get(field, "") for field in fields)
    >>
    >> Somewhat labour-intensive. It appears from the OP's description that
    >> no other entries can exist in the dictionary. If this is so, then:
    >>
    >> everything = "".join(form.values())
    >>
    >> but what the user sees on screen isn't necessarily what you get, so:
    >>
    >> everything = "".join(form.values()).strip()
    >>
    >>> if everything == "":
    >>> print "Absolutely nothing entered!"
    >>>
    John Machin, Apr 16, 2006
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    788
  2. Jay McGavren
    Replies:
    11
    Views:
    1,111
    Alan Krueger
    Jan 16, 2006
  3. tedsuzman
    Replies:
    2
    Views:
    7,062
    Michel Claveau, résurectionné d'outre-bombe inform
    Jul 21, 2004
  4. Ted
    Replies:
    1
    Views:
    451
    Duncan Booth
    Jul 22, 2004
  5. Kun
    Replies:
    3
    Views:
    291
    Peter Otten
    Apr 16, 2006
Loading...

Share This Page