Antoine Pitrou wrote:
Michael Foord <fuzzyman <at> voidspace.org.uk> writes:
Simple string formatting with %s and a single object or a tuple meets >90% of my string formatting needs.

Not to mention that e.g. "%r" % s is much simpler than "{0!r}".format(s)
(if I got the format spec right).

repr(s) is even simpler :)

The basic idea for conversions to the new formatting:

'%r' % v --> repr(v) # or ascii(v) if more appropriate
'%s' % v --> str(v) # or format(v), or format(v, '')

The str/unicode stability that the latter provided in 2.x is no longer needed in 3.x. The first one never had any advantage that I can see over invoking repr() directly (since repr() and %r always produce an 8-bit string in 2.x)

The conversion of fmt % v depends on both fmt and v:

v is a single value, fmt is only a formatting code:
  '%x' % v--> format(v, 'x')

v is a single value, fmt is both a formatting code and additional text:
  'Value: %x' % v--> 'Value: {0:x}'.format(v)
Note that the old code in this case wouldn't display dict or tuple instances correctly. Avoiding that ambiguity is a major advantage of the new approach.

v is a tuple* (more on this below):
  'Key: %s Value: %s' % k, v --> 'Key: {0} Value: {1}'.format(k, v)

fmt uses named parameters:
  'Value: %(val)s' % dict(val=v) --> 'Value: {val}'.format(val=v)

* I still think the new str.format approach is too verbose and requires too much thought for simple use cases where the printf-style % replacement hits a sweet spot between being easy to write and easy to read.

So I see the introduction of str.format in 3.0 as an opportunity to *fix* %-formatting later in the 3.x series rather than get rid of it entirely. The fixes I would apply:

- remove support for %(name)s based formatting (str.format is vastly superior once you start naming the parameters).

- remove support for passing a single value to a format string without wrapping it in an iterable first

- accept any iterable as the right hand argument str.__mod__

This approach would eliminate the current ambiguity in fmt.v, and would allow fmt % [x] to be used to box an argument for safe use in a single-parameter format string instead of having to muck around with singleton tuples.

Cheers,
Nick.

--
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
            http://www.boredomandlaziness.org
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to