Why use "locals()"
Steven D'Aprano
steven at REMOVE.THIS.cybersource.com.au
Mon Sep 14 00:11:44 EDT 2009
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
More information about the Python-list
mailing list