Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
format() not behaving as expected
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  7 messages - Collapse all  -  Translate all to Translated (View all originals)
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Josh English  
View profile  
 More options Jun 29 2012, 12:31 pm
Newsgroups: comp.lang.python
From: Josh English <Joshua.R.Engl...@gmail.com>
Date: Fri, 29 Jun 2012 09:31:53 -0700 (PDT)
Local: Fri, Jun 29 2012 12:31 pm
Subject: format() not behaving as expected
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?


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
MRAB  
View profile  
 More options Jun 29 2012, 1:02 pm
Newsgroups: comp.lang.python
From: MRAB <pyt...@mrabarnett.plus.com>
Date: Fri, 29 Jun 2012 18:02:45 +0100
Local: Fri, Jun 29 2012 1:02 pm
Subject: Re: format() not behaving as expected
On 29/06/2012 17:31, Josh English 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'


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Steven D'Aprano  
View profile  
 More options Jun 29 2012, 1:08 pm
Newsgroups: comp.lang.python
From: Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info>
Date: 29 Jun 2012 17:08:20 GMT
Local: Fri, Jun 29 2012 1:08 pm
Subject: Re: format() not behaving as expected

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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Josh English  
View profile  
 More options Jun 29 2012, 1:19 pm
Newsgroups: comp.lang.python
From: Josh English <Joshua.R.Engl...@gmail.com>
Date: Fri, 29 Jun 2012 10:19:30 -0700 (PDT)
Local: Fri, Jun 29 2012 1:19 pm
Subject: Re: format() not behaving as expected

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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Josh English  
View profile  
 More options Jun 29 2012, 1:19 pm
Newsgroups: comp.lang.python
From: Josh English <Joshua.R.Engl...@gmail.com>
Date: Fri, 29 Jun 2012 10:19:30 -0700 (PDT)
Local: Fri, Jun 29 2012 1:19 pm
Subject: Re: format() not behaving as expected

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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Josh English  
View profile  
 More options Jun 29 2012, 1:24 pm
Newsgroups: comp.lang.python
From: Josh English <Joshua.R.Engl...@gmail.com>
Date: Fri, 29 Jun 2012 10:24:58 -0700 (PDT)
Local: Fri, Jun 29 2012 1:24 pm
Subject: Re: format() not behaving as expected

On Friday, June 29, 2012 10:08:20 AM UTC-7, Steven D&#39;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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
MRAB  
View profile  
 More options Jun 29 2012, 1:41 pm
Newsgroups: comp.lang.python
From: MRAB <pyt...@mrabarnett.plus.com>
Date: Fri, 29 Jun 2012 18:41:29 +0100
Local: Fri, Jun 29 2012 1:41 pm
Subject: Re: format() not behaving as expected
On 29/06/2012 18:19, Josh English wrote:

 > 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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
End of messages
« Back to Discussions « Newer topic     Older topic »