Brian van den Broek wrote:
Fredrik Lundh said unto the world upon 2005-04-11 10:14:
"fabian" wrote:
how testing if a variable exists in python as isset in php??

try: variable except NameError: print "variable not set"

but that is really lousy Python; better make sure you always assign to
all variables, and use None (or another suitable value) to mark that some
variable has no meaningful content right now.

that is, instead of
<SNIP full try/except example>
write

    variable = None
    if condition:
        variable = 1
    ...
    if variable is None:
        print "variable not set"

I'm a hobbyist and still learning, but the claim the try/except is
"lousy Python" surprise me a bit. The try/except way seems like an
instance of "Easier to ask Forgiveness than Permission", and my sense
is that in 95% of cases that approach is widely considered more Pythonic than LBYL (of which the suggested idiom seems reminiscent).


As it happens, most of my code does preset names to None, but reading
this thread made me wonder. Are you suggesting setting to None is
better as it makes explicit that there is nothing there, but this may
change in the future? (This is why I do it.) Or for some other reason?

I had a similar reaction to Fredrik's statement. In general, I wouldn't call a try/except solution lousy style, as long as the path through except was sufficiently "exceptional". That is, for code like:


    if condition_that_happens_99_percent_of_the_time:
        variable = 1
    try:
        variable
    except NameError:
        print "variable not set"

seems perfectly reasonable to me, because the exception is caught in the *exceptional* case. However, if one case isn't clearly the exceptional one, then it probably doesn't makes sense to use an exception, and I'd write it like:

    variable = None
    if condition_that_happens_40_percent_of_the_time:
        variable = 1
    ...
    if variable is None:
        print "variable not set"

Actually, I typically refactor my code so that I can write situations like this as:

    if condition_that_happens_40_percent_of_the_time:
        variable = 1
        ...
    else:
        print "variable not set"

But the point still stands. If the variable being unset really is an exceptional case, use an exception. If it's not, then an if/else block is probably the better way to go.

STeVe
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to