[Python-ideas] Transportable indent level markers. /// ; ; ; \\\

Ron Adam ron3200 at gmail.com
Tue Dec 13 01:01:00 CET 2011


On Mon, 2011-12-12 at 23:15 +0000, MRAB wrote:
> On 12/12/2011 22:07, Ron Adam wrote:
> >
> > While typing this reply to the "Alternate Suite Delineation Syntax For
> > Python?" thread.  I realized that having things  all on a single line
> > isn't important or needed!!!  Yes, it's not needed for templates, or
> > code generation.  So this is an alternate to the alternate.
> >
> > What is needed is a uniform way to represent indenting that is easy to
> > transport to (ie paste into) code with different indent levels.
> >
> >
> > INDENT LEVEL MARKERS:
> > ----------------------
> > Offer a new way to spell<indent+1>,<indent+0>, and<indent-1>.
> >
> > To make that work, we need to use unique character sequences that aren't
> > already used.  After some thought, I came up with these indent-markers.
> >
> >      ///   # indent level +1
> >      ;;;   # indent level +0
> >      \\\   # indent level -1
> >
> > These are unique enough to be easy to see, and the tripled versions of
> > them aren't really that bad as we already have triple quotes, and they
> > would be less than the white space they are replacing in most cases.
> >
> > So this isn't brackets, or braces. It would be just an alternate
> > spelling in already valid python. It should not effect the parser,
> > grammar, or interpreter in any way if it is done in pythons
> > tokenizer.  :-)
> >
> [snip]
> -1
> 
> If the problem is with leading whitespace being stripped, then what
> about the non-breaking space ("\xA0")? We all use Unicode now, don't
> we? :-)

Think bigger!  ie... easy automated program content and construction.

You have this string...

foo_bit.py
"""
def foo(*args):
    result = <do something with args>
    return result
x = foo(a, b, c)
"""

And you want it to be inserted in this string automatically with the
least amount of processing.  (with another program you have.)

bar_bit.py
"""
    ...
    def bar(a, b, c):
        ...
<insert foo_bit.py here>
        ...
        return x
    ...
"""
(where ... means more lines of python code.)


Now if you do a quick simple substitution you get.

"""
    ...
    def bar(a, b, c):
        ...
def foo(*args):
    result = <do something with args>
    return result
x = foo(a, b, c)
        ...
        return x
    ...
"""

Which won't work and is why template programs need to
do a lot of pre and post processing to get things right.

If foo_bit.py was like this...

"""
;;; def foo(*args):
;;;    result = <do something with args>
;;;    return result
;;; x = foo(a, b, c)
"""

Then you would get...

"""
    ...
    def bar(a, b, c):
        ...
;;; def foo(*args):
;;;    result = <do something with args>
;;;    return result
;;; x = foo(a, b, c)
        ...
        return x
    ...
"""

And the tokenizer in python could read that directly as ...

    ...
    def bar(a, b, c):
        ...
        def foo(*args):
            result = <do something with args>
            return result
        x = foo(a, b, c)
        ...
        return x
    ...

Which would make doing things like this really easy instead of really
tricky.

The indent level of bar.py won't matter because the indent marker ';;;'
says to use the current level of indent before this line.

Does that make more sense now?

Cheers,
   Ron





























More information about the Python-ideas mailing list