Why use "locals()"

Sean DiZazzo half.italian at gmail.com
Mon Sep 14 01:12:50 EDT 2009


On Sep 13, 9:11 pm, Steven D'Aprano
<ste... at REMOVE.THIS.cybersource.com.au> wrote:
> On Sun, 13 Sep 2009 20:26:06 -0700, Sean DiZazzo wrote:
> > On Sep 13, 8:18 pm, Steven D'Aprano
> > <ste... at REMOVE.THIS.cybersource.com.au> wrote:
> >> On Sun, 13 Sep 2009 20:06:51 -0700, Sean DiZazzo wrote:
> >> > I have never used a call to "locals()" in my code.  Can you show me a
> >> > use case where it is valuable and Pythonic?
>
> >> grep is your friend:
>
> >> $ grep "locals()" /usr/lib/python2.5/*.py
> >> /usr/lib/python2.5/decimal.py:        for name, val in
> >> locals().items(): /usr/lib/python2.5/doctest.py:        return
> >> __import__(module, globals(), locals(), ["*"])
> >> /usr/lib/python2.5/profile.py:        p.runctx('f(m)', globals(),
> >> locals()) /usr/lib/python2.5/pydoc.py:            docloc = '<br><a
> >> href="%(docloc)s">Module Docs</a>' % locals()
> >> /usr/lib/python2.5/smtpd.py:        mod =
> >> __import__(classname[:lastdot], globals(), locals(), [""])
>
> >> --
> >> Steven
>
> > That is not a use case. I still don't understand!
>
> Look at the source code to find out what they're doing with the
> information they extract from locals(), and why.
>
> For instance, profile should be obvious -- debuggers and profilers often
> need to see the values of local names.
>
> pydoc is using the fairly common idiom of injecting the values of
> variables into a string. Personally, I don't see why it uses this idiom:
>
>     docloc = 'something'
>     docloc = '%(docloc)s' % locals()
>
> instead of this:
>
>     docloc = 'something'
>     docloc = '%s' % docloc
>
> but for more complicated cases, the first idiom is much simpler.
>
> decimal seems to be using locals() to avoid this anti-pattern:
>
> def __init__(self, a, b, c, d, e, f, g, h):
>     self.a = a
>     self.b = b
>     self.c = c
>     self.d = d
>     # blah blah blah
>     self.h = h
>
> and replacing it with:
>
> def __init__(self, a, b, c, d, e, f, g, h):
>     for name, val in locals().items():
>         setattr(self, name, val)
>     del self.self
>
> Another use-case: if you have a tool that documents Python code
> automatically, it needs a way to automatically view the values of local
> names.
>
> > PS.  I know how to use grep.
>
> I'm sure you do. But you didn't think of using grep, which is why I made
> the suggestion that grepping the standard library is a good tool to use
> to search for Pythonic examples of code.
>
> It's not foolproof, e.g. the unittest module is more Java-onic than
> Pythonic, but it's a good start.
>
> --
> Steven

Thanks for your explanation Steven.  I see how it can be valuable, but
it seems to always break the second rule of Zen.  I don't really want
to get into the code of debuggers, but I guess I can see how they
might have no other way to know what local variables have been set.

~Sean



More information about the Python-list mailing list