format() not behaving as expected

Discussion in 'Python' started by Josh English, Jun 29, 2012.

  1. Josh English

    Josh English Guest

    I have a list of tuples, and usually print them using:

    print c, " ".join(map(str, list_of_tuples))

    This is beginning to feel clunky (but gives me essentially what I want), and I thought there was a better, more concise, way to achieve this, so I explored the new string format and format() function:

    >>> c = (1,3)
    >>> s = "{0[0]}"
    >>> print s.format(c)

    '1'
    >>> print format(c,s)

    Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    ValueError: Invalid conversion specification

    I'm running *** Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. ***
    (This is actually a PortablePython run on a Windows 7 machine)

    Any idea why one form works and the other doesn't?
    Josh English, Jun 29, 2012
    #1
    1. Advertising

  2. Josh English

    MRAB Guest

    On 29/06/2012 17:31, Josh English wrote:
    > I have a list of tuples, and usually print them using:
    >
    > print c, " ".join(map(str, list_of_tuples))
    >
    > This is beginning to feel clunky (but gives me essentially what I want), and I thought there was a better, more concise, way to achieve this, so I explored the new string format and format() function:
    >
    >>>> c = (1,3)
    >>>> s = "{0[0]}"
    >>>> print s.format(c)

    > '1'
    >>>> print format(c,s)

    > Traceback (most recent call last):
    > File "<interactive input>", line 1, in <module>
    > ValueError: Invalid conversion specification
    >
    > I'm running *** Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. ***
    > (This is actually a PortablePython run on a Windows 7 machine)
    >
    > Any idea why one form works and the other doesn't?
    >

    The ".format" method accepts multiple arguments, so the placeholders in
    the format string need to specify which argument to format as well as
    how to format it (the format specification after the ":").

    The "format" function, on the other hand, accepts only a single
    argument to format, so it needs only the format specification, and
    therefore can't accept subscripting or attributes.

    >>> c = "foo"
    >>> print "{0:s}".format(c)

    foo
    >>> format(c, "s")

    'foo'
    MRAB, Jun 29, 2012
    #2
    1. Advertising

  3. On Fri, 29 Jun 2012 09:31:53 -0700, Josh English wrote:

    > I have a list of tuples, and usually print them using:
    >
    > print c, " ".join(map(str, list_of_tuples))
    >
    > This is beginning to feel clunky (but gives me essentially what I want),
    > and I thought there was a better, more concise, way to achieve this, so
    > I explored the new string format and format() function:
    >
    >>>> c = (1,3)
    >>>> s = "{0[0]}"
    >>>> print s.format(c)

    > '1'


    That's not actually the output copied and pasted. You have quotes around
    the string, which you don't get if you pass it to the print command.


    >>>> print format(c,s)

    > Traceback (most recent call last):
    > File "<interactive input>", line 1, in <module>
    > ValueError: Invalid conversion specification

    [...]
    > Any idea why one form works and the other doesn't?


    Because the format built-in function is not the same as the format string
    method.

    The string method takes brace substitutions, like "{0[0]}" which returns
    the first item of the first argument.

    The format function takes a format spec, not a brace substitution. For
    example:

    >>> format(c, '<10s')

    '(1, 3) '
    >>> format(c, '>10s')

    ' (1, 3)'
    >>> format(c, '*>10s')

    '****(1, 3)'

    The details of the format spec are in the Fine Manual:

    http://docs.python.org/library/string.html#formatspec

    although sadly all the examples are about using brace substitutions, not
    format specs.

    (Personally, I find the documentation about format to be less than
    helpful.)

    You can also read the PEP that introduced the new formatting, but keep in
    mind that there have been some changes since the PEP was written, so it
    may not quite match the current status quo.

    http://www.python.org/dev/peps/pep-3101/


    --
    Steven
    Steven D'Aprano, Jun 29, 2012
    #3
  4. Josh English

    Josh English Guest

    On Friday, June 29, 2012 10:02:45 AM UTC-7, MRAB wrote:
    >
    > The ".format" method accepts multiple arguments, so the placeholders in
    > the format string need to specify which argument to format as well as
    > how to format it (the format specification after the ":").
    >
    > The "format" function, on the other hand, accepts only a single
    > argument to format, so it needs only the format specification, and
    > therefore can't accept subscripting or attributes.
    >
    > >>> c = "foo"
    > >>> print "{0:s}".format(c)

    > foo
    > >>> format(c, "s")

    > 'foo'


    Thank you. That's beginning to make sense to me. If I understand this, everything between the braces is the format specification, and the format specification doesn't include the braces, right?

    Josh
    Josh English, Jun 29, 2012
    #4
  5. Josh English

    Josh English Guest

    On Friday, June 29, 2012 10:02:45 AM UTC-7, MRAB wrote:
    >
    > The ".format" method accepts multiple arguments, so the placeholders in
    > the format string need to specify which argument to format as well as
    > how to format it (the format specification after the ":").
    >
    > The "format" function, on the other hand, accepts only a single
    > argument to format, so it needs only the format specification, and
    > therefore can't accept subscripting or attributes.
    >
    > >>> c = "foo"
    > >>> print "{0:s}".format(c)

    > foo
    > >>> format(c, "s")

    > 'foo'


    Thank you. That's beginning to make sense to me. If I understand this, everything between the braces is the format specification, and the format specification doesn't include the braces, right?

    Josh
    Josh English, Jun 29, 2012
    #5
  6. Josh English

    Josh English Guest

    On Friday, June 29, 2012 10:08:20 AM UTC-7, Steven D'Aprano wrote:
    > >>>> c = (1,3)
    > >>>> s = "{0[0]}"
    > >>>> print s.format(c)

    > > '1'

    >
    > That's not actually the output copied and pasted. You have quotes around
    > the string, which you don't get if you pass it to the print command.
    >


    Mea culpa. I typed it in manually because the direct copy and paste was rather ugly full of errors because of many haplographies.



    > >>>> print format(c,s)

    > > Traceback (most recent call last):
    > > File "<interactive input>", line 1, in <module>
    > > ValueError: Invalid conversion specification

    > [...]
    > > Any idea why one form works and the other doesn't?

    >
    > Because the format built-in function is not the same as the format string
    > method.

    ....
    >
    > (Personally, I find the documentation about format to be less than
    > helpful.)
    >


    Thanks. I think it's coming together.

    Either way, this format seems uglier than what I had before, and it's longer to type out. I suppose that's just programmers preference.

    Josh
    Josh English, Jun 29, 2012
    #6
  7. Josh English

    MRAB Guest

    On 29/06/2012 18:19, Josh English wrote:
    > On Friday, June 29, 2012 10:02:45 AM UTC-7, MRAB wrote:
    >>
    >> The ".format" method accepts multiple arguments, so the placeholders in
    >> the format string need to specify which argument to format as well as
    >> how to format it (the format specification after the ":").
    >>
    >> The "format" function, on the other hand, accepts only a single
    >> argument to format, so it needs only the format specification, and
    >> therefore can't accept subscripting or attributes.
    >>
    >> >>> c = "foo"
    >> >>> print "{0:s}".format(c)

    >> foo
    >> >>> format(c, "s")

    >> 'foo'

    >
    > Thank you. That's beginning to make sense to me. If I understand this,
    > everything between the braces is the format specification,
    > and the format specification doesn't include the braces, right?
    >

    No, the format specification is the part after the ":" (if present), as
    in the example.

    Here are more examples:

    >>> c = "foo"
    >>> print "{0}".format(c)

    foo
    >>> format(c, "")

    'foo'
    >>> print "To 2 decimal places: {0:0.2f}".format(1.2345)

    To 2 decimal places: 1.23
    >>> print format(1.2345, "0.02f")

    1.23
    MRAB, Jun 29, 2012
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ken Kafieh
    Replies:
    7
    Views:
    2,471
    Roedy Green
    May 19, 2004
  2. William Krick
    Replies:
    4
    Views:
    77,820
    rt19983
    Dec 18, 2008
  3. Skip Montanaro

    sys._getframe() not behaving as expected

    Skip Montanaro, Dec 1, 2003, in forum: Python
    Replies:
    0
    Views:
    344
    Skip Montanaro
    Dec 1, 2003
  4. Replies:
    1
    Views:
    333
    David
    Apr 16, 2007
  5. Steve Richter
    Replies:
    2
    Views:
    591
    Steve Richter
    May 29, 2007
Loading...

Share This Page