469,312 Members | 2,440 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,312 developers. It's quick & easy.

String formatting strangeness

I must be doing something wrong, but for the life of me, I can't figure
out what. Here's the code snippet which is giving me grief:

print type(number), type(name), type(seconds // 60), type(seconds % 60)
print "\t\t\t<section number=\"%i\" title=\"%s\" length=\"%i:%i\"/>\n"
% [number, name, seconds // 60, seconds % 60]

(These are lines 49 and 50 of the script; I can post the whole thing if
someone wants, but I think this is enough to see why it's driving me
nuts.)

And the output:

<type 'int'> <type 'str'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "X:\Music (FLAC)\Post-process new rips.py", line 50, in ?
print "\t\t\t<section number=\"%i\" title=\"%s\"
length=\"%i:%i\"/>\n" % [number, name, seconds // 60, seconds % 60]
TypeError: int argument required

Wait, what? The first line clearly identifies that the the first,
third, and fourth elements are all integers, yet the error says that
*lack* of integers is the problem. If I change all "%i"s to "%d", I
get the same problem, and changing to "%s" (hey, it was worth a shot)
gives "TypeError: not enough arguments for format string" instead.
Huh? I see four placeholders and a four-element tuple.

Can anyone enlighten me here?

Jul 19 '05 #1
5 1224
da********@gmail.com wrote:
I must be doing something wrong, but for the life of me, I can't figure
out what. Here's the code snippet which is giving me grief:

print type(number), type(name), type(seconds // 60), type(seconds % 60)
print "\t\t\t<section number=\"%i\" title=\"%s\" length=\"%i:%i\"/>\n"
% [number, name, seconds // 60, seconds % 60] [snip]
Wait, what? The first line clearly identifies that the the first,
third, and fourth elements are all integers, yet the error says that
*lack* of integers is the problem. If I change all "%i"s to "%d", I
get the same problem, and changing to "%s" (hey, it was worth a shot)
gives "TypeError: not enough arguments for format string" instead.
Huh? I see four placeholders and a four-element tuple.


Nope, you see a four-element list. Try changing it to a tuple... ;-)

-Peter
Jul 19 '05 #2
The argument to string format expression needs to be a tuple not a list.

Also, all the string escaping makes this very hard to read. You can
mix single and double quotes to achieve:

print '\t\t\t<section number="%i" title="%s" length="%i:%i"/>\n' % \
(number, name, seconds // 60, seconds % 60)

which IMHO is much easier to read.

Larry Bates

da********@gmail.com wrote:
I must be doing something wrong, but for the life of me, I can't figure
out what. Here's the code snippet which is giving me grief:

print type(number), type(name), type(seconds // 60), type(seconds % 60)
print "\t\t\t<section number=\"%i\" title=\"%s\" length=\"%i:%i\"/>\n"
% [number, name, seconds // 60, seconds % 60]

(These are lines 49 and 50 of the script; I can post the whole thing if
someone wants, but I think this is enough to see why it's driving me
nuts.)

And the output:

<type 'int'> <type 'str'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "X:\Music (FLAC)\Post-process new rips.py", line 50, in ?
print "\t\t\t<section number=\"%i\" title=\"%s\"
length=\"%i:%i\"/>\n" % [number, name, seconds // 60, seconds % 60]
TypeError: int argument required

Wait, what? The first line clearly identifies that the the first,
third, and fourth elements are all integers, yet the error says that
*lack* of integers is the problem. If I change all "%i"s to "%d", I
get the same problem, and changing to "%s" (hey, it was worth a shot)
gives "TypeError: not enough arguments for format string" instead.
Huh? I see four placeholders and a four-element tuple.

Can anyone enlighten me here?

Jul 19 '05 #3
da********@gmail.com wrote:
<type 'int'> <type 'str'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "X:\Music (FLAC)\Post-process new rips.py", line 50, in ?
print "\t\t\t<section number=\"%i\" title=\"%s\"
length=\"%i:%i\"/>\n" % [number, name, seconds // 60, seconds % 60]
TypeError: int argument required

Wait, what? The first line clearly identifies that the the first,
third, and fourth elements are all integers, yet the error says that
*lack* of integers is the problem. If I change all "%i"s to "%d", I
get the same problem, and changing to "%s" (hey, it was worth a shot)
gives "TypeError: not enough arguments for format string" instead.
Huh? I see four placeholders and a four-element tuple.


[number, name, seconds // 60, seconds % 60] is not a tuple.

(number, name, seconds // 60, seconds % 60) is a tuple.

</F>

Jul 19 '05 #4
*hides face* Groan! This is what I get for trying to code first thing
in the morning. Thanks, all, it works fine now...

Jul 19 '05 #5
da********@gmail.com writes:
I must be doing something wrong, but for the life of me, I can't figure
out what. Here's the code snippet which is giving me grief:

print type(number), type(name), type(seconds // 60), type(seconds % 60)
print "\t\t\t<section number=\"%i\" title=\"%s\" length=\"%i:%i\"/>\n"
% [number, name, seconds // 60, seconds % 60]

(These are lines 49 and 50 of the script; I can post the whole thing if
someone wants, but I think this is enough to see why it's driving me
nuts.)

And the output:

<type 'int'> <type 'str'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "X:\Music (FLAC)\Post-process new rips.py", line 50, in ?
print "\t\t\t<section number=\"%i\" title=\"%s\"
length=\"%i:%i\"/>\n" % [number, name, seconds // 60, seconds % 60]
TypeError: int argument required

Wait, what? The first line clearly identifies that the the first,
third, and fourth elements are all integers, yet the error says that
*lack* of integers is the problem. If I change all "%i"s to "%d", I
get the same problem, and changing to "%s" (hey, it was worth a shot)
gives "TypeError: not enough arguments for format string" instead.
Huh? I see four placeholders and a four-element tuple.

Can anyone enlighten me here?


I notice you used a list instead of a tuple.
Changing to a tuple gives the desired output:

number=1
name="myname"
seconds=250
print "\t\t\t<section number=\"%i\" title=\"%s\" length=\"%i:%i\"/>\n" \
% (number, name, seconds // 60, seconds % 60)

<section number="1" title="myname" length="4:10"/>

I have no idea why a list has that effect.

PS: When writing XML and HTML, I use single quotes, so I don't have to
escape double quotes:
print '\t\t\t<section number="%i" title="%s" length="%i:%i"/>\n' \
% (number, name, seconds // 60, seconds % 60)
--
ha************@boeing.com
6-6M21 BCA CompArch Design Engineering
Phone: (425) 294-4718
Jul 19 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Thomas Philips | last post: by
10 posts views Thread by Oliver S. | last post: by
20 posts views Thread by hagai26 | last post: by
5 posts views Thread by Andrew Connell | last post: by
7 posts views Thread by ilona | last post: by
6 posts views Thread by Joe | last post: by
7 posts views Thread by L. Scott M. | last post: by
14 posts views Thread by Scott M. | last post: by
1 post views Thread by schoedl | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
1 post views Thread by Geralt96 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.