[Python-3000] Proposed changes to PEP3101 advanced string formatting -- please discuss and vote!

Josiah Carlson jcarlson at uci.edu
Wed Mar 14 00:21:34 CET 2007


"Patrick Maupin" <pmaupin at gmail.com> wrote:
[snip]
> Feature:  Alternate syntaxes for escape to markup.
[snip]
> The second method is the well-understood ${} syntax.  The $ is easy to
> find in a sea of { characters, and the only special handling required
> is that every $ must be doubled.

I think this is reasonable.


> The third method is something I came up with a couple of years ago
> when I was generating a lot of C code from templates.  It would make
> any non-Python programmer blanch, because it relies on significant
> whitespace, but it made for very readable technical templates.  WIth
> this method "{foo}" escapes to markup, but when there is whitespace
> after the leading "{",  e.g. "{ foo}", the brace is not an escape to
> markup.  If the whitespace is a space, it is removed from the output,
> but if it is '\r', '\n', or '\t', then it is left in the output.  The
> result is that, for example, most braces in most C texts do not need
> to have spaces inserted after them, because they immediately precede a
> newline.

-1

Sounds far too implicit to me.  I would much prefer a completely
different syntax.  Having just had a patch that implements Windows shell
variable expansion as $var, ${var} and %var% (the last being new), I
can't help but think that %var% would be a better alternate explicit
syntax than the 'space follows {' implicit syntax you are offering.

[snip]
> Feature:  Automatic search of locals() and globals() for name lookups
> if no parameters are given.

-1

for the obvious 'Explicit is better than implicit'.


> Feature: Ability to pass in a dictionary or tuple of dictionaries of
> namespaces to search.

+1

I can see where it would be useful for code using something like
"...".format(obj.__dict__, defaults)


[snip]
> Feature: Addition of functions and "constants" to string module.
> 
> The PEP proposes doing everything as string methods, with a "cformat"
> method allowing some access to the underlying machinery.  I propose
> only having a 'format' method of the string (unicode) type, and a
> corresponding 'format' and extended 'flag_format' function in the
> string module, along with definitions for the flags for access to
> non-default underlying format machinery.

Sounds good to me.


> Feature: Ability for "field hook" user code function to only be called
> on some fields.
> 
> The PEP takes an all-or-nothing approach to the field hook -- it is
> either called on every field or no fields.  Furthermore, it is only
> available for calling if the extended function ('somestring'.cformat()
> in the spec, string.flag_format() in this proposal) is called.  The
> proposed change keeps this functionality, but also adds a field type
> specifier 'h' which causes the field hook to be called as needed on a
> per-field basis.  This latter method can even be used from the default
> 'somestring'.format() method.
> 
> 
> Changed feature: By default, not using all arguments is not an exception

+1

I can see how it would be useful to have '...'.format(obj.__dict__) to
format portions of some object.  Requiring the explicit passing of names,
and/or the construction of a new dictionary would be foolish.
Practicality beats purity.


> Feature:  Ability to insert non-printing comments in format strings
> 
> This feature is implemented in a very intuitive way, e.g. " text {#
> your comment here} more text" (example shown with the default
> transition to markup syntax).  One of the nice benefits of this
> feature is the ability to break up long source lines (if you have lots
> of long variable names and attribute lookups).

-1

The user can use the parser/compiler to get this behavior for free.

    (" text " #your comment here
     "more text").format(...)


> Feature:  Exception raised if attribute with leading underscore accessed.
> 
> The syntax supported by the PEP is deliberately limited in an attempt
> to increase security.  This is an additional security measure, which
> is on by default, but can be optionally disabled if
> string.flag_format() is used instead of 'somestring'.format().

+1


> Feature: Support for "center" alignment.
> 
> The field specifier uses "<" and ">" for left and right alignment.
> This adds "^" for center alignment.

+.5

There is use for this, but I'm not sure that '^' is as clear as '<' or
'>' in the left/right alignment case.  Its meaning certainly doesn't
jump out to me as 'center' (then again, < and > don't jump out as left
and right alignment either...).


> Feature: support of earlier versions of Python

+1

> Feature: no global state
> 
> The original PEP specified a global error-handling mode, which
> controlled a few capabilities.  The current implementation has no
> global state -- any non-default options are accessed by using the
> string.flag_format() function.

Great.  Global state is a great way of having things break when threads
get involved.

 - Josiah



More information about the Python-3000 mailing list