On Sep 13, 9:11 pm, Steven D'Aprano <ste...@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...@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 -- http://mail.python.org/mailman/listinfo/python-list