[Python-Dev] locals(), closures, and IronPython...

Andrew Dalke dalke at dalkescientific.com
Tue Mar 6 09:41:53 CET 2007


On 3/5/07, Guido van Rossum <guido at python.org> wrote:
> I don't know too many good use cases for
> locals() apart from "learning about the implementation" I think this
> might be okay.

Since I'm watching this list for any discussion on the traceback
threads, I figured I would point out the most common use I know
for locals() is in string interpolation when there are many local
variables, eg:

   a = "spam"
   b = "egg"
    ...
   y = "foo"
   z = "bar"

  print fmtstr % locals()

The next most is to deal with a large number of input parameters, as
this from decimal.py:

    def __init__(self, prec=None, rounding=None,
                 traps=None, flags=None,
                 _rounding_decision=None,
                 Emin=None, Emax=None,
                 capitals=None, _clamp=0,
                 _ignored_flags=None):
          ...
        for name, val in locals().items():
            if val is None:
                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
            else:
                setattr(self, name, val)

and this example based on a post of Alex Martelli's:

    def __init__(self, fee, fie, foo, fum):
        self.__dict__.update(locals())
        del self.self

In both cases they are shortcuts to "reduce boilerplate".

I've more often used the first form in my code.  If an
inner local returned a superset of the items it returns now,
I would not be concerned.

I've rarely used the 2nd form in my code.  The only way
I can see there being a problem is if a function defines
a class, which then uses the locals() trick, because

>>> def blah():
...    a = 6; b = 7
...    class XYZ(object):
...      def __init__(self):
...        c = a
...        print "in the class", locals()
...    print "in the function", locals()
...    XYZ()
...
>>> blah()
in the function {'a': 6, 'XYZ': <class '__main__.XYZ'>, 'b': 7}
in the class {'a': 6, 'c': 6, 'self': <__main__.XYZ object at 0x72ad0>}

the code in the class's initializer will have more locals.  I've
never seen code like this (class defined in a function, with __init__
using locals()) and it's not something someone would write
thinking it was a standard way of doing things.


In both cases I'm not that bothered if it's implementation specific.
Using locals has the feel of being too much like a trick to get
around having to type so much.  That's what editor macros are for :)

        Andrew
        dalke at dalkescientific.com


More information about the Python-Dev mailing list