Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > how to use bool

Reply
Thread Tools

how to use bool

 
 
jimgardener@gmail.com
Guest
Posts: n/a
 
      01-03-2008
hi, i have some code where i set a bool type variable and if the value
is false i would like to return from the method with an error msg..
being a beginner I wd like some help here

class myclass:
.........
def mymethod(self):
success=True
msg="all validation OK"
success=validateSthing()
if(success==False):
msg="sthing failed"
return (success,msg)

dosomeprocessing()
.....
success=validateSthingelse()
if(success==False):
msg="sthingelse failed"
return (success,msg)
domoreprocessing()
....
return(success,msg)

i would like to know if this way of doing this is OK..I have need of
many kinds of validations in this ..is there a better way of doing
this ?

thank you

 
Reply With Quote
 
 
 
 
Fredrik Lundh
Guest
Posts: n/a
 
      01-03-2008
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> hi, i have some code where i set a bool type variable and if the value
> is false i would like to return from the method with an error msg..
> being a beginner I wd like some help here
>
> class myclass:
> .........
> def mymethod(self):
> success=True
> msg="all validation OK"
> success=validateSthing()
> if(success==False):
> msg="sthing failed"
> return (success,msg)
>
> dosomeprocessing()
> .....
> success=validateSthingelse()
> if(success==False):
> msg="sthingelse failed"
> return (success,msg)
> domoreprocessing()
> ....
> return(success,msg)
>
> i would like to know if this way of doing this is OK..I have need of
> many kinds of validations in this ..is there a better way of doing
> this ?


to test boolean values, it's usually better to use plain "if" or "if
not" statements:

if success:
... handle success here ...

if not success:
... handle failure here ...

to report failures, use exceptions (the raise and try/except
statements). see the tutorial for more on this topic.

</F>

 
Reply With Quote
 
 
 
 
tinnews@isbd.co.uk
Guest
Posts: n/a
 
      01-03-2008
(E-Mail Removed) wrote:
> hi, i have some code where i set a bool type variable and if the value
> is false i would like to return from the method with an error msg..
> being a beginner I wd like some help here
>
> class myclass:
> .........
> def mymethod(self):
> success=True
> msg="all validation OK"
> success=validateSthing()
> if(success==False):
> msg="sthing failed"
> return (success,msg)
>
> dosomeprocessing()
> .....
> success=validateSthingelse()
> if(success==False):
> msg="sthingelse failed"
> return (success,msg)
> domoreprocessing()
> ....
> return(success,msg)
>
> i would like to know if this way of doing this is OK..I have need of
> many kinds of validations in this ..is there a better way of doing
> this ?
>

With my philosophical programming hat on the first thing I'd say (as a
fairly beginning python programmer) is "avoid multiple returns from a
function/method if at all possible". They breed all sorts of problems
and errors, in particular if there's any clearing up to do you have to
do it in lots of places (or you forget it in some places).

So:-

def mymethod(self):
msg="sthing failed"
success=validateSthing()
if success:
dosomeprocessing()
.....
success=validateSthingelse()
if success:
domoreprocessing()
....
msg="all validation OK"
return (success,msg)

I've lost the different messages for different errors but you get the
idea.


"if success:" rather than "if (success==True)", more readable. For
the opposite "if not success:".



--
Chris Green
 
Reply With Quote
 
Chris Mellon
Guest
Posts: n/a
 
      01-03-2008
On 03 Jan 2008 16:09:53 GMT, <(E-Mail Removed)> wrote:
>
> (E-Mail Removed) wrote:
> > hi, i have some code where i set a bool type variable and if the value
> > is false i would like to return from the method with an error msg..
> > being a beginner I wd like some help here
> >
> > class myclass:
> > .........
> > def mymethod(self):
> > success=True
> > msg="all validation OK"
> > success=validateSthing()
> > if(success==False):
> > msg="sthing failed"
> > return (success,msg)
> >
> > dosomeprocessing()
> > .....
> > success=validateSthingelse()
> > if(success==False):
> > msg="sthingelse failed"
> > return (success,msg)
> > domoreprocessing()
> > ....
> > return(success,msg)
> >
> > i would like to know if this way of doing this is OK..I have need of
> > many kinds of validations in this ..is there a better way of doing
> > this ?
> >

> With my philosophical programming hat on the first thing I'd say (as a
> fairly beginning python programmer) is "avoid multiple returns from a
> function/method if at all possible". They breed all sorts of problems
> and errors, in particular if there's any clearing up to do you have to
> do it in lots of places (or you forget it in some places).
>


This advice is highly controversial, and in the presence of exceptions
it is, at best, voodoo coding. Since your function can exit at any
point whether you do it intentionally or not, if you have crucial
cleanup it's best to write your code in a way that does it correctly
even if you return early. Following this style also often leads to odd
contortions, like extra layers of indentation, and a proliferation of
temporary flags and value-holders that aren't necessary if you write
the code in a more straight forward manner.

Make your decisions on a case by case basis of complexity,
readability, and reliability instead of following pronouncements from
on high (especially decades old pronouncements made in a different
context). Forcing a single return site in the code below adds
complexity, arguable harms readability, and provides *zero* benefit in
the code at hand.

> So:-
>
> def mymethod(self):
> msg="sthing failed"
> success=validateSthing()
> if success:
> dosomeprocessing()
> .....
> success=validateSthingelse()
> if success:
> domoreprocessing()
> ....
> msg="all validation OK"
> return (success,msg)
>
> I've lost the different messages for different errors but you get the
> idea.
>
>
> "if success:" rather than "if (success==True)", more readable. For
> the opposite "if not success:".
>
>
>
> --
> Chris Green
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>

 
Reply With Quote
 
tinnews@isbd.co.uk
Guest
Posts: n/a
 
      01-04-2008
Chris Mellon <(E-Mail Removed)> wrote:
> On 03 Jan 2008 16:09:53 GMT, <(E-Mail Removed)> wrote:
> >
> > (E-Mail Removed) wrote:
> > > hi, i have some code where i set a bool type variable and if the value
> > > is false i would like to return from the method with an error msg..
> > > being a beginner I wd like some help here
> > >
> > > class myclass:
> > > .........
> > > def mymethod(self):
> > > success=True
> > > msg="all validation OK"
> > > success=validateSthing()
> > > if(success==False):
> > > msg="sthing failed"
> > > return (success,msg)
> > >
> > > dosomeprocessing()
> > > .....
> > > success=validateSthingelse()
> > > if(success==False):
> > > msg="sthingelse failed"
> > > return (success,msg)
> > > domoreprocessing()
> > > ....
> > > return(success,msg)
> > >
> > > i would like to know if this way of doing this is OK..I have need of
> > > many kinds of validations in this ..is there a better way of doing
> > > this ?
> > >

> > With my philosophical programming hat on the first thing I'd say (as a
> > fairly beginning python programmer) is "avoid multiple returns from a
> > function/method if at all possible". They breed all sorts of problems
> > and errors, in particular if there's any clearing up to do you have to
> > do it in lots of places (or you forget it in some places).
> >

>
> This advice is highly controversial, and in the presence of exceptions
> it is, at best, voodoo coding. Since your function can exit at any
> point whether you do it intentionally or not, if you have crucial
> cleanup it's best to write your code in a way that does it correctly
> even if you return early. Following this style also often leads to odd
> contortions, like extra layers of indentation, and a proliferation of
> temporary flags and value-holders that aren't necessary if you write
> the code in a more straight forward manner.
>

OK, I agree, I had my C hat on (no exceptions).

On the other hand if you end with lots of levels of indentation going
this way it suggests to me that maybe breaking up into more functions
would be a good idea.


> Make your decisions on a case by case basis of complexity,
> readability, and reliability instead of following pronouncements from
> on high (especially decades old pronouncements made in a different
> context). Forcing a single return site in the code below adds
> complexity, arguable harms readability, and provides *zero* benefit in
> the code at hand.
>
> > So:-
> >
> > def mymethod(self):
> > msg="sthing failed"
> > success=validateSthing()
> > if success:
> > dosomeprocessing()
> > .....
> > success=validateSthingelse()
> > if success:
> > domoreprocessing()
> > ....
> > msg="all validation OK"
> > return (success,msg)
> >
> > I've lost the different messages for different errors but you get the
> > idea.
> >
> >
> > "if success:" rather than "if (success==True)", more readable. For
> > the opposite "if not success:".
> >
> >
> >
> > --
> > Chris Green
> >
> > --
> > http://mail.python.org/mailman/listinfo/python-list
> >


--
Chris Green
 
Reply With Quote
 
Paul McGuire
Guest
Posts: n/a
 
      01-04-2008
On Jan 3, 10:09*am, (E-Mail Removed) wrote:
>
> With my philosophical programming hat on the first thing I'd say (as a
> fairly beginning python programmer) is "avoid multiple returns from a
> function/method if at all possible". *They breed all sorts of problems
> and errors, in particular if there's any clearing up to do you have to
> do it in lots of places (or you forget it in some places).
>


This conventional wisdom predates the introduction of constructs such
as try-catch-finally. In fact, you are just lulling yourself into
some false security if you think that that single return at the end of
your method is the only exit point of your routine. Exceptions can
(and will) happen just about anywhere.

I know, you had your C hat on, but even C++'ers fall into this trap.
I was on a project that cited explicit delete statements during code
reviews as likely memory leaks in the face of exceptions, and each was
to be replaced with auto-cleanup objects such as auto_ptr. The same
was done for other resource alloc/release pairs, such as locks,
database connections, cursors, etc. These were looooong-running
server processes, and they ran for months with no memory growth at
all.

If I were to suggest a similar topic for Python code reviews, it would
be to look at paired statements and to ensure that the cleanup/
recovery statement was wrapped in a finally block.

There's more than just memory that needs bookkeeping, so garbage
collection wont solve all these other resource management problems.

-- Paul
 
Reply With Quote
 
bukzor
Guest
Posts: n/a
 
      01-04-2008
On Jan 3, 7:49 am, (E-Mail Removed) wrote:
> hi, i have some code where i set a bool type variable and if the value
> is false i would like to return from the method with an error msg..
> being a beginner I wd like some help here
>
> class myclass:
> .........
> def mymethod(self):
> success=True
> msg="all validation OK"
> success=validateSthing()
> if(success==False):
> msg="sthing failed"
> return (success,msg)
>
> dosomeprocessing()
> .....
> success=validateSthingelse()
> if(success==False):
> msg="sthingelse failed"
> return (success,msg)
> domoreprocessing()
> ....
> return(success,msg)
>
> i would like to know if this way of doing this is OK..I have need of
> many kinds of validations in this ..is there a better way of doing
> this ?
>
> thank you


class SthingError(Exception):
def __init__(self, success, msg):




class myclass:
.........
def mymethod(self):
success=True
if not validateSthing():
msg="sthing failed"
return (success,msg)

dosomeprocessing()
.....
if not validateSthingelse():
msg="sthingelse failed"
return (success,msg)
domoreprocessing()
....
return(success,"all validation OK")
 
Reply With Quote
 
bukzor
Guest
Posts: n/a
 
      01-04-2008
On Jan 4, 8:51 am, bukzor <(E-Mail Removed)> wrote:
> On Jan 3, 7:49 am, (E-Mail Removed) wrote:
>
>
>
> > hi, i have some code where i set a bool type variable and if the value
> > is false i would like to return from the method with an error msg..
> > being a beginner I wd like some help here

>
> > class myclass:
> > .........
> > def mymethod(self):
> > success=True
> > msg="all validation OK"
> > success=validateSthing()
> > if(success==False):
> > msg="sthing failed"
> > return (success,msg)

>
> > dosomeprocessing()
> > .....
> > success=validateSthingelse()
> > if(success==False):
> > msg="sthingelse failed"
> > return (success,msg)
> > domoreprocessing()
> > ....
> > return(success,msg)

>
> > i would like to know if this way of doing this is OK..I have need of
> > many kinds of validations in this ..is there a better way of doing
> > this ?

>
> > thank you



Please ignore my previous post. I accidentally submitted early. I made
your example runnable (hope you don't mind). The 'pythonic' way to do
error handling is to use exceptions. Below is a pretty good example.
Also I've elimiated all your temporary variables. Your original
function is quite short now and does the same thing. You can expand
out the derived exception class if you want to pass more data to your
error handler, but generally the message is enough, and that comes
with the default constructor.


#helper functions
from time import time
from random import seed
seed(time())
def random(chance):
from random import uniform
if uniform(0, 1) < chance: return True
else: return False
def dosomeprocessing(x):
if random(.1): raise Exception("Something bad happened while
processing %s!" % x)
else: print x
def validateSthing():
if random(.2): raise SthingError("this Sthing is messed up!")


#rewrite of your example
class SthingError(Exception): pass
class myclass:
def mymethod(self):
validateSthing()
dosomeprocessing(1)
validateSthing()
dosomeprocessing(2)



#exercise of the class and error handling
m = myclass()
try:
m.mymethod()
print "Completed successfully!"
except SthingError, ste:
print "STHINGERROR:"
print ste
except Exception, e: print e

print
print "This time no error handling:"
m.mymethod()

 
Reply With Quote
 
jimgardener@gmail.com
Guest
Posts: n/a
 
      01-06-2008
hi bukzor & everyone who replied

thanks for the detailed replies
will try to write that way
thanx a lot
jim



bukzor wrote:
> On Jan 4, 8:51 am, bukzor <(E-Mail Removed)> wrote:
>
> #exercise of the class and error handling
> m = myclass()
> try:
> m.mymethod()
> print "Completed successfully!"
> except SthingError, ste:
> print "STHINGERROR:"
> print ste
> except Exception, e: print e
>
> print
> print "This time no error handling:"
> m.mymethod()

 
Reply With Quote
 
Paul Hankin
Guest
Posts: n/a
 
      01-06-2008
On Jan 3, 3:49*pm, (E-Mail Removed) wrote:
> hi, i have some code where i set a bool type variable and if the value
> is false i would like to return from the method with an error msg..
> being a beginner I wd like some help here
>
> class myclass:
> * * *.........
> * * def *mymethod(self):
> * * * * * * *success=True
> * * * * * * *msg="all validation OK"
> * * * * * * *success=validateSthing()
> * * * * * * *if(success==False):
> * * * * * * * * * *msg="sthing failed"
> * * * * * * * * * *return (success,msg)
>
> * * * * * * *dosomeprocessing()
> * * * * * * *.....
> * * * * * * *success=validateSthingelse()
> * * * * * * *if(success==False):
> * * * * * * * * * *msg="sthingelse *failed"
> * * * * * * * * * *return (success,msg)
> * * * * * * *domoreprocessing()
> * * * * * * * ....
> * * * * * * * *return(success,msg)
>
> i would like to know if this way of doing this is OK..I have need of
> many kinds of validations in this ..is there a better way of doing
> this ?


As everyone's pointed out, you should use exceptions for this sort of
thing.
> def mymethod(self):
> success=True
> msg="all validation OK"
> success=validateSthing()
> if(success==False):
> msg="sthing failed"
> return (success,msg)
>
> dosomeprocessing()
> .....
> success=validateSthingelse()
> if(success==False):
> msg="sthingelse failed"
> return (success,msg)
> domoreprocessing()
> ....
> return(success,msg)


As everyone else has pointed out, you should use exceptions for this
sort of thing. But even without exceptions, you can write your code a
lot more cleanly by omitting all the temporary variables. That way,
you don't have to search around to see where things are used (eg.
seeing where "all validation OK" is used requires you to read every
line of your method).

def mymethod(self):
if not validateSthing():
return (False, "sthing failed")
dosomeprocessing()
....
if not validateSthingelse():
return (False, "sthingelse failed")
domoreprocessing()
...
return (True, "all validation OK")

Isn't that a lot more readable?

--
Paul Hankin
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Easy way to make Numarray Bool use 1 bit? andrewfelch@gmail.com Python 1 02-07-2006 10:11 PM
Need standard function to do (Bool and Vector) Weng Tianxiang VHDL 2 06-21-2005 12:01 AM
Re: Convert DataRow content to bool Eliyahu Goldin ASP .Net 0 07-07-2003 01:32 PM
Re: Convert DataRow content to bool Ignacio Machin ASP .Net 0 07-07-2003 12:16 PM



Advertisments