469,645 Members | 1,150 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,645 developers. It's quick & easy.

multiple parameters in if statement

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

Apr 16 '06 #1
6 2737
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.

Apr 16 '06 #2
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

Apr 16 '06 #3
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

Apr 16 '06 #4
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!"

Apr 16 '06 #5
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!"

Apr 16 '06 #6
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!"

Apr 16 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

32 posts views Thread by tshad | last post: by
12 posts views Thread by Dennis D. | last post: by
7 posts views Thread by Ceebaby via AccessMonster.com | last post: by
reply views Thread by gheharukoh7 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.