multiple parameters in if statement

K

Kun

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
 
S

Steven D'Aprano

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")
 
J

John Machin

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):

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
>>>
 
J

John Zenger

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!"
 
J

John Machin

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()
 
J

John Zenger

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 said:
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!"
 
J

John Machin

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 said:
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!"
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top