[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

how to use bool

jimgardener

1/3/2008 3:49:00 PM

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

13 Answers

Fredrik Lundh

1/3/2008 3:57:00 PM

0

jimgardener@gmail.com 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>

tinnews

1/3/2008 4:10:00 PM

0

jimgardener@gmail.com 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

Chris Mellon

1/3/2008 4:53:00 PM

0

On 03 Jan 2008 16:09:53 GMT, <tinnews@isbd.co.uk> wrote:
>
> jimgardener@gmail.com 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/p...
>

tinnews

1/4/2008 4:32:00 PM

0

Chris Mellon <arkanes@gmail.com> wrote:
> On 03 Jan 2008 16:09:53 GMT, <tinnews@isbd.co.uk> wrote:
> >
> > jimgardener@gmail.com 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/p...
> >

--
Chris Green

Paul McGuire

1/4/2008 4:46:00 PM

0

On Jan 3, 10:09 am, tinn...@isbd.co.uk 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

bukzor

1/4/2008 4:52:00 PM

0

On Jan 3, 7:49 am, jimgarde...@gmail.com 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")

bukzor

1/4/2008 5:22:00 PM

0

On Jan 4, 8:51 am, bukzor <workithar...@gmail.com> wrote:
> On Jan 3, 7:49 am, jimgarde...@gmail.com 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()

jimgardener

1/6/2008 7:55:00 AM

0

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 <workithar...@gmail.com> 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()

Paul Hankin

1/6/2008 1:16:00 PM

0

On Jan 3, 3:49 pm, jimgarde...@gmail.com 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

jimgardener

1/6/2008 4:56:00 PM

0



some more doubts in this area,,forgive the ignorance of a beginner

i have

class MyError(Exception):
def __init__(self,msg)
self.msg=msg

now my method that can raise this is

class SomeClass:
...........
def mymethod(self):
if (somecondition):
raise MyError("somecondn failed")

if another method in the same class calls this method but wants to
pass the error to a gui code which calls it,,can i do like this

def callingmethode(self):
try:
mymethod()
except MyError,myerr:
raise myerr

so that I can handle the error in a gui code that calls
callingmethode()

class MyGUI:
def guimethode(self):
someinst=SomeClass()
try:
someinst.callingmethode()
except MyError,myer:
self.dealwithMyError(myer)

is this kind of raising exception the correct way?I am getting syntax
error at
except MyError,myerr:
raise myerr