Structure using whitespace vs logical whitespace
MRAB
google at mrabarnett.plus.com
Mon Dec 15 12:14:34 EST 2008
cmdrrickhunter at yaho.com wrote:
> I've been trying to search through the years of Python talk to find an
> answer to this, but my Googlefu is weak.
>
> In most languages, I'll do something like this
>
> xmlWriter.BeginElement("parent");
> ----xmlWriter.BeginElement("child");
> ----------xml.Writer.Characters("subtext");
> ----xmlWriter.EndElement();
> xmlWriter.EndElement();
>
> Where the dashes are indentation (since some newsgroup handlers don't
> do tabs well). XML writing is just an example.
>
> In general, I'm using indentation to show logical flow through code.
> Python's choice to give semantic meaning to whitespace prevents me
> from doing such things. What was once reserved for logical use is now
> used syntactically. In 90% of cases, its not needed, and whitespace
> significance seems to be pretty effective. In that last 10%, however,
> I've been frustrated many times.
>
> I've been using python for a few years, and gotten around this in one
> way or another, but now I want to get other who work with me to pick
> up Python. All newbies to Python have trouble with the idea of
> whitespace sensitivity, but how can I convince them that "it just
> works better" when I have this construct which I want to use but
> can't.
>
> Has anybody found a way to emulate this behavior? I've often done it
> by opening an expression for the whole thing, but there's a lot of
> tasks where a single expression just isn't sufficient (such as things
> with assignment).
>
> PS. In my opinion the solution would be to have the option of entering
> a "whitespace insensitive" mode which uses C style {} and ;. The
> token to enter it could be as complicated as you want (in fact, it may
> make sense to make it complicated to discourage use unless it's really
> advantageous). I'd sugest {{ and }} or something bigger like {={ }
> =}. Only two problems: 1) I'm sure it would offend Guido's sense of
> language aesthetics 2) I'm sure the idea has been hashed over on this
> newsgroup to death... hence prefering a workaround instead.
>
You could use the "with" statement:
class xml_element(object):
def __init__(self, text):
self.text = text
def __enter__(self):
xmlWriter.BeginElement(self.text)
def __exit__(self, *args):
xmlWriter.EndElement()
with xml_element("parent"):
with xml_element("child"):
xmlWriter.Characters("subtext")
More information about the Python-list
mailing list