Re: String formatting with nested dictionaries

2006-08-24 Thread Diez B. Roggisch
[EMAIL PROTECTED] schrieb:
> I've got a bit of code which has a dictionary nested within another
> dictionary.  I'm trying to print out specific values from the inner
> dict in a formatted string and I'm running into a roadblock.  I can't
> figure out how to get a value from the inner dict into the string.  To
> make this even more complicated this is being compiled into a large
> string including other parts of the outer dict.
> 
> mydict = {'inner_dict':{'Value1':1, 'Value2':2}, 'foo':'bar',
> 'Hammer':'nails'}
> 
> print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s
> and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to pound
> in %(Hammer)s" % mydict
> 
> The above fails looking for a key named 'inner_dict['Value1']' which
> doesn't exist.
> 
> I've looked through the docs and google and can't find anything
> relating to this.

Because it is not supported. You can only use one level of keys, and it 
must be strings. So you have to do it like this:


print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s 
and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to 
poundin %(Hammer)s" % dict(Hammer=mydict['Hammer'], 
Value1=mydict["inner_dict"]["Value1"], 
Value2=mydict["inner_dict"]["Value2"])


Diez

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: String formatting with nested dictionaries

2006-08-24 Thread Gabriel Genellina

At Thursday 24/8/2006 13:22, [EMAIL PROTECTED] wrote:


I've got a bit of code which has a dictionary nested within another
dictionary.  I'm trying to print out specific values from the inner
dict in a formatted string and I'm running into a roadblock.  I can't
figure out how to get a value from the inner dict into the string.  To
make this even more complicated this is being compiled into a large
string including other parts of the outer dict.

mydict = {'inner_dict':{'Value1':1, 'Value2':2}, 'foo':'bar',
'Hammer':'nails'}

print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s
and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to pound
in %(Hammer)s" % mydict

The above fails looking for a key named 'inner_dict['Value1']' which
doesn't exist.


I can think of two ways:

a) Flatten your dictionary. That is, move the contents of inner_dict 
onto the outer dict:

mydict.update(mydict['inner_dict'])
Then use single names for interpolation

b) Do the interpolation in two steps.

template = "foo is set to %(foo)s - Value One is: %(Value1)s
and Value Two is: %(Value2)s -- Hammers are used to pound
in %(Hammer)s"
output = template % mydict['inner_dict']
output = output % mydict

Both methods assume that the inner dict takes precedence in case of 
name clashes; reverse the order if you want the opposite.



Gabriel Genellina
Softlab SRL 






__
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya! 
http://www.yahoo.com.ar/respuestas


-- 
http://mail.python.org/mailman/listinfo/python-list

Re: String formatting with nested dictionaries

2006-08-24 Thread [EMAIL PROTECTED]

Gabriel Genellina wrote:
> At Thursday 24/8/2006 13:22, [EMAIL PROTECTED] wrote:
>
> >I've got a bit of code which has a dictionary nested within another
> >dictionary.  I'm trying to print out specific values from the inner
> >dict in a formatted string and I'm running into a roadblock.  I can't
> >figure out how to get a value from the inner dict into the string.  To
> >make this even more complicated this is being compiled into a large
> >string including other parts of the outer dict.
> >
> >mydict = {'inner_dict':{'Value1':1, 'Value2':2}, 'foo':'bar',
> >'Hammer':'nails'}
> >
> >print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s
> >and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to pound
> >in %(Hammer)s" % mydict
> >
> >The above fails looking for a key named 'inner_dict['Value1']' which
> >doesn't exist.
>
> I can think of two ways:
>
> a) Flatten your dictionary. That is, move the contents of inner_dict
> onto the outer dict:
> mydict.update(mydict['inner_dict'])
> Then use single names for interpolation
>
> b) Do the interpolation in two steps.
>
> template = "foo is set to %(foo)s - Value One is: %(Value1)s
> and Value Two is: %(Value2)s -- Hammers are used to pound
> in %(Hammer)s"
> output = template % mydict['inner_dict']
> output = output % mydict
>
> Both methods assume that the inner dict takes precedence in case of
> name clashes; reverse the order if you want the opposite.
>
>
> Gabriel Genellina
> Softlab SRL
>

Thanks,  I started going with a) only doing it the long way.
(mydict['Value1'] = mydict['inner_dict']['Value1'])  mydict.update() is
*much* simpler and less prone to errors too.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: String formatting with nested dictionaries

2006-08-24 Thread Fredrik Lundh
[EMAIL PROTECTED] wrote:

> I've got a bit of code which has a dictionary nested within another
> dictionary.  I'm trying to print out specific values from the inner
> dict in a formatted string and I'm running into a roadblock.  I can't
> figure out how to get a value from the inner dict into the string.  To
> make this even more complicated this is being compiled into a large
> string including other parts of the outer dict.
> 
> mydict = {'inner_dict':{'Value1':1, 'Value2':2}, 'foo':'bar',
> 'Hammer':'nails'}
> 
> print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s
> and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to pound
> in %(Hammer)s" % mydict
> 
> The above fails looking for a key named 'inner_dict['Value1']' which
> doesn't exist.

the % operator treats the keys as plain keys, not expressions.  if you 
trust the template provider, you can use a custom wrapper to evaluate 
the key expressions:

mydict = {'inner_dict':{'Value1':1, 'Value2':2}, 'foo':'bar', 
'Hammer':'nails'}

class wrapper:
 def __init__(self, dict):
self.dict = dict
 def __getitem__(self, key):
try:
return self.dict[key]
except KeyError:
return eval(key, self.dict)

print "foo is set to %(foo)s - Value One is: %(inner_dict['Value1'])s 
and Value Two is: %(inner_dict['Value2'])s -- Hammers are used to pound 
in %(Hammer)s" % wrapper(mydict)

foo is set to bar - Value One is: 1 and Value Two is: 2 -- Hammers are 
used to pound in nails



-- 
http://mail.python.org/mailman/listinfo/python-list


Re: String formatting with nested dictionaries

2006-08-24 Thread Maric Michaud
Le jeudi 24 août 2006 21:02, Fredrik Lundh a écrit :
> class wrapper:
>      def __init__(self, dict):
> self.dict = dict
>      def __getitem__(self, key):
> try:
>     return self.dict[key]
> except KeyError:
>    

Quite the same idea, but without eval and the need to know the internal dict 
arborescence :

In [242]: class nested_dict_wrapper :
   .: def __init__(self, dic) :
   .: self._all = [dic] + [nested_dict_wrapper(v) for v in 
dic.values() if isinstance(v, dict)]
   .: def __getitem__(self, v) :
   .: for i in self._all :
   .: try : return i[v]
   .: except KeyError: pass
   .: raise KeyError(v + ' not found in dict and subdicts')
   .:
   .:

In [248]: complex_dict = { '0': 'zero', '1':'one', 'in1' : {'2':'two'}, 'in2':
{'3': 'three', '4' :'four', 'deeper':{'5':'five', '6':'six'}}, '7':'seven' }

In [250]: "%%(%s)s "*7 % tuple(range(7)) % nested_dict_wrapper(complex_dict)
Out[250]: 'zero one two three four five six '

In [251]: "%%(%s)s "*8 % tuple(range(8)) % nested_dict_wrapper(complex_dict)
Out[251]: 'zero one two three four five six seven '

In [252]: "%%(%s)s "*9 % tuple(range(9)) % nested_dict_wrapper(complex_dict)
---
exceptions.KeyError  Traceback (most recent 
call last)

/home/maric/

/home/maric/ in __getitem__(self, v)

KeyError: '8 not found in dict and subdicts'


-- 
_

Maric Michaud
_

Aristote - www.aristote.info
3 place des tapis
69004 Lyon
Tel: +33 426 880 097
-- 
http://mail.python.org/mailman/listinfo/python-list