Changing self: if self is a tree how to set to a different self

Paul McGuire ptmcg at
Sat Jul 12 14:46:03 CEST 2008

On Jul 12, 6:18 am, Bart Kastermans <kaste... at bart-kastermanss-
macbook.local> wrote:
> This uses the function:
> def NoneOr (tree, mem_function, *arguments):
>     """ if tree is not None then tree.mem_function (arguments). """
>     if tree == None:
>         return None
>     else:
>         return getattr (tree, mem_function) (*arguments)
> Bart

This code reads wrongly to me on a couple of levels.  First, I think
the general computing consensus is that if-then-else is more readable/
logical if you assert the positive condition for the then-part, and
put the alternative condition in the else-part.  My impression is that
the non-None-ness of tree is actually the positive assertion, as in:

    if tree != None:
        return getattr(tree, mem_function)(*arguments)
        return None

Next, the more Pythonic test for None-ness is most clearly written as:

    if tree is not None:

as there is only one None, and the identity "is not" check is simpler/
faster for Python to execute (and possibly - and more importantly -
also simpler for readers to follow, as this reads more like a
continuous sentence instead of a mixture of prose and mathematical

One might even suggest you could further abbreviate this test to:

    if tree:

and get the same behavior.  I would quibble with that, however, that
this merely exploits a side-effect of Python, in which None values are
always False, and *most* non-None values are True.  But Python also
interprets many non-None values as False, such as 0, or empty
containers, such as lists, tuples, dicts, and strings.  In fact, your
tree class sounds like a structured container to me, and it would be
reasonable to assume that you might implement __nonzero__ (pre-Python
2.6) or __bool__ (Python 2.6 and later) in your class to return False
for an empty tree, which would still be a valid and not-None tree.
You should be able to invoke methods on an empty tree just as one can
call "".upper().  So for this case, I would stick with the more
explicit "if tree is not None".

Another Pythonicity is that methods will *always* return a value, even
if you do not write a return statement - and that value is None.  So
if you assert the tree-not-None as the if condition, you don't even
need the else part.  You could just write:

    def NoneOr (tree, mem_function, *arguments):
        """ if tree is not None then tree.mem_function (arguments).
        if tree is not None:
            return getattr(tree, mem_function)(*arguments)

Surprisingly, this actually reads almost verbatim from your doc
string!  So I would guess that this implementation is probably closest
to your original intent for this method.  Still, for explicitness'-
sake, you might want to keep the else-part, just to make your intent
clear and spelled-out.  (Complaining about the presence or absence of
this bit of code goes beyond "persnickety"...)

Note that the original code is perfectly valid Python, and will run
just as efficiently as any of my alternative suggestions, which is why
I enclosed my comments in 'persnickety' (http:// tags.

-- Paul

More information about the Python-list mailing list