String formatting strangeness

D

dark.ryder

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?
 
P

Peter Hansen

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
 
L

Larry Bates

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
 
F

Fredrik Lundh

<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>
 
H

Harry George

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)
 
D

dark.ryder

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

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top