Printing formatted strings from a dictionary

T

Thomas Philips

I want to print "1 spam 4 you" using a formatted string that gets its
inputs from the dictionary d={'n1':1, 's1':'spam', 'n2':4}. To do so,
I write

Traceback (most recent call last):
File "<pyshell#22>", line 1, in -toplevel-
x % d
KeyError: "'n1'"
However, I get what I want if I edit x to remove the quotes around n1,
s1 and n2 and write'1 spam 4 you'

The syntax that works seems to run counter to the way dictionaries
work:

Traceback (most recent call last):
File "<pyshell#18>", line 1, in -toplevel-
d[n1]
NameError: name 'n1' is not defined

What is the error in my logic?

Thomas Philips
 
S

Sean Berry

d={'n1':1, 's1':'spam', 'n2':4}
x = "%s %s %s you" %(d['n1'], d['s1'], d['n2'])
x '1 spam 4 you'


Thomas Philips said:
I want to print "1 spam 4 you" using a formatted string that gets its
inputs from the dictionary d={'n1':1, 's1':'spam', 'n2':4}. To do so,
I write

Traceback (most recent call last):
File "<pyshell#22>", line 1, in -toplevel-
x % d
KeyError: "'n1'"
However, I get what I want if I edit x to remove the quotes around n1,
s1 and n2 and write'1 spam 4 you'

The syntax that works seems to run counter to the way dictionaries
work:

Traceback (most recent call last):
File "<pyshell#18>", line 1, in -toplevel-
d[n1]
NameError: name 'n1' is not defined

What is the error in my logic?

Thomas Philips
 
M

Michael Hudson

I want to print "1 spam 4 you" using a formatted string that gets its
inputs from the dictionary d={'n1':1, 's1':'spam', 'n2':4}. To do so,
I write

Traceback (most recent call last):
File "<pyshell#22>", line 1, in -toplevel-
x % d
KeyError: "'n1'"
However, I get what I want if I edit x to remove the quotes around n1,
s1 and n2 and write'1 spam 4 you'

The syntax that works seems to run counter to the way dictionaries
work:

Traceback (most recent call last):
File "<pyshell#18>", line 1, in -toplevel-
d[n1]
NameError: name 'n1' is not defined

What is the error in my logic?

Um. If the n1 is already inside a string literal, adding more quotes
would be redundant?

CHeers,
mwh
 
P

Peter Abel

Michael Hudson said:
I want to print "1 spam 4 you" using a formatted string that gets its
inputs from the dictionary d={'n1':1, 's1':'spam', 'n2':4}. To do so,
I write
x="%('n1')d %('s1')s %('n2')d you"
x % d

Traceback (most recent call last):
File "<pyshell#22>", line 1, in -toplevel-
x % d
KeyError: "'n1'"
However, I get what I want if I edit x to remove the quotes around n1,
s1 and n2 and write
x="%(n1)d %(s1)s %(n2)d you"
x % d
'1 spam 4 you'

The syntax that works seems to run counter to the way dictionaries
work:
d['n1'] 1
d[n1]

Traceback (most recent call last):
File "<pyshell#18>", line 1, in -toplevel-
d[n1]
NameError: name 'n1' is not defined

What is the error in my logic?

Um. If the n1 is already inside a string literal, adding more quotes
would be redundant?

CHeers,
mwh

In Python every variable is hold in a dictionary where the key
is a string with the variable's name and the value is the object
where the variable is bound to.
The dictionary which holds the global variables is globals()
the dictionary for the local variables is locals() and the
dictionary for instances-attributes is instance.__dict__.
And always the key of the dictionary is a string. But when
you play around with a variable you address it by its name not
by a string.
So the following is equivalent:

As you see:

The same is in the following example:
.... def __init__(self):
.... self.a=1
.... self.b=2
.... 2

Addressing x.a and x.b by dictionary:
x.__dict__['a'] 1
x.__dict__['b'] 2

And back to your problem. Though the keys in the dictionaries are strings
you can address them by their names even if it is a self-made dictionary
and the same way you have to do in dictionary-formatting.

Regards
Peter
 
J

Josiah Carlson

[snip good reply from Peter]

The other thing to remember is that there are implicit quotes:Traceback (most recent call last):
'2'

- Josiah
 
P

Peter Abel

Josiah Carlson said:
[snip good reply from Peter]

The other thing to remember is that there are implicit quotes:Traceback (most recent call last):
'2'

Uuuaaah, I can't stop learning YOU(python). Couldn't verify
the above example. Maybe some fault happened to you because the code
which raised the KeyError and the successfull one are the same for me.
But the following works:
I even would not have believed that this kind of formatting would work.
But the more I think about it the more it becomes consequential and logical.
- Peter -
 
T

Terry Reedy

Peter Abel said:
'2'
I even would not have believed that this kind of formatting would work.
But the more I think about it the more it becomes consequential and logical.

From Lib Ref 2.3.6.2. String Formatting ...

Mapping key (optional), consisting of a parenthesised sequence of
characters (for example, somename)).

Examples generally use names for the char sequence, but restricting the
sequence to a name would require more work for less functionality. Since %
works with unicode as well as byte strings, one can, I presume, interpolate
with unicode keys as well.

Terry J. Reedy
 
J

Josiah Carlson

Uuuaaah, I can't stop learning YOU(python). Couldn't verify
the above example. Maybe some fault happened to you because the code
which raised the KeyError and the successfull one are the same for me.
But the following works:


'2'

Right, I forgot to rebind d. My bad, but it is great that you figured
it out.

- Josiah
 

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,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top