[Python-Dev] OT: style convention: self vs. _ in new Norvig's book

Jason Orendorff jason@jorendorff.com
Mon, 21 Jan 2002 14:47:59 -0600


> ] In general, follow Guido's style conventions,
> ] but I have some quirks that I prefer (although I could be talked 
> ] out of them):
> ...
> ] * _ instead of self as first argument to methods: def f(_, x):
> ...

I dunno; I think sample code should (a) stick rather conservatively
to typical usage, apart from the concept being illustrated of course;
and (b) strive for maximum readability.

For Python, both principles demand that one should write:

    def foo(bar):
        if is_list(bar):
            return sum(map(foo, bar))
        else:
            return [bar]

instead of:

    def foo(bar):
      if is_list(bar):  return sum(map(foo, bar))
      else:  return [bar]

This may be one of those things that only makes sense if you've
not a Lisp programmer.  (wink)

To stray from the topic:  I find I only disagree with three points
in Peter Norvig's enlightening table of Lisp vs. Python features.
<http://www.norvig.com/python-lisp.html>

1.  That "x.slot = y" is not user-extensible.
    The __setattr__() method does this.

2.  That Python's relative lack of control structures is
    necessarily worse than Lisp's abundance of them.
    Especially for students, I think this:

      if is_list(n):
          return foo_l(n)
      elif is_str(n) or is_int(n):
          return foo_a(n)
      else:
          raise TypeError

    is at least as clear, though not as brief, as this:

      (etypecase n
                 (list (foo-l n))
                 ((or string integer) (foo-a n)))

    with the obligatory note in the text to the effect that
    "'Etypecase' is a form similar to 'case' which selects
    a clause based on the type..." and so on.

3.  That Python doesn't support generic programming.
    Generic algorithms are expressed as naturally in Python
    as in any language I know:

      from operator import add
      def sum(items):
          return reduce(add, items)

      >>> sum([3, 4, 5])
      12
      >>> sum([3, 4j, 4-2j])    
      (7+2j)
      >>> sum(["py", "th", "o", "n"])
      'python'

    Likewise it's natural to write functions that can operate
    on "any sequence", not just lists or tuples, "any file-like
    object", not just a real file, "any function-like object",
    etc.

    Perhaps something more specific is meant by "generic
    programming".

Cheers,
## Jason Orendorff    http://www.jorendorff.com/