how are dictionary literals handled by the interpreter?

Bruno Desthuilliers onurb at xiludom.gro
Thu Sep 14 06:37:09 EDT 2006


akameswaran at gmail.com wrote:
> I wrote up a quick little set of tests, I was acutally comparing ways
> of doing "case" behavior just to get some performance information.  Now
> two of my test cases had almost identical results which was not at all
> what I expected.  Ultimately I realized I don't really know how
> literals are treated within the interpreter.
> 
> The two implementations I was looking at were:
> 
> class caseFunction(object):
>     def __init__(self):
>         self.caseDict = {'a':"retval = 'a'",
> 'b':"retval='b'","c":"retval='c'","d":"retval='d'",
> 
> "e":"retval='e'","f":"retval='f'","g":"retval='g'","h":"retval='h'",
>                          "i":"retval='i'"}
> 
>     def doIt(self,a):
>         exec(self.caseDict.get(a))
>         return retval

Err...  Why would you want to exec anything here ? Remember that
Python's functions are objects too:

def funcA(*args, **kw):
  return "funcA called with %s %s" % (str(args), kw)

def funcB(*args, **kw):
  return "funcB called with %s %s" % (str(args), kw)

def funcC(*args, **kw):
  return "funcC called with %s %s" % (str(args), kw)

def defaultFunc(*args, **kw):
  return "defaultFunc called with %s %s" % (str(args), kw)

class SwitchFunc(object):
  def __init__(self, default, **kw):
    self._default = default
    self._switch = kw

  # makes the object callable.
  def __call__(self, case, *args, **kw):
    func = self._switch.get(case, self._default)
    return func(*args, **kw)

switch = SwitchFunc(defaultFunc, a=funcA, b=funcB, c=funcC)

for case in "abcX":
  print switch(case, "foo", q=42)

HTH
-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list