[Tutor] eval use (directly by interpreter vs with in a script)
Steven D'Aprano
steve at pearwood.info
Tue Nov 4 20:18:28 CET 2014
On Tue, Nov 04, 2014 at 04:11:13PM +0000, Albert-Jan Roskam wrote:
> Hmm, I get 1900 occurrences of eval() (and 700 of frozenset, just
> curious) in Python. That's MUCH, I must be something wrong, but I am
> rushing now!
For what it's worth, in Python 2.7, and *only* looking at the top level
of the standard library, I get 23 occurances of "eval(". 11 of those are
false positives, that is, comments, docstrings, or functions named
"something_eval(".
[steve at ando ~]$ python2.7 -c "import timeit; print(timeit.__file__)"
/usr/local/lib/python2.7/timeit.pyc
[steve at ando ~]$ grep "eval(" /usr/local/lib/python2.7/*.py | wc -l
23
[steve at ando ~]$ grep "eval(" /usr/local/lib/python2.7/*.py
/usr/local/lib/python2.7/ast.py:def literal_eval(node_or_string):
/usr/local/lib/python2.7/bdb.py: def runeval(self, expr, globals=None, locals=None):
/usr/local/lib/python2.7/bdb.py: return eval(expr, globals, locals)
/usr/local/lib/python2.7/bdb.py: val = eval(b.cond, frame.f_globals,
/usr/local/lib/python2.7/decimal.py: # Invariant: eval(repr(d)) == d
/usr/local/lib/python2.7/dumbdbm.py: key, pos_and_siz_pair = eval(line)
/usr/local/lib/python2.7/gettext.py: return eval('lambda n: int(%s)' % plural)
/usr/local/lib/python2.7/mhlib.py: def do(s): print s; print eval(s)
/usr/local/lib/python2.7/pdb.py: func = eval(arg,
/usr/local/lib/python2.7/pdb.py: return eval(arg, self.curframe.f_globals,
/usr/local/lib/python2.7/pdb.py: x = eval(arg, {}, {})
/usr/local/lib/python2.7/pdb.py: value = eval(arg, self.curframe.f_globals,
/usr/local/lib/python2.7/pdb.py:def runeval(expression, globals=None, locals=None):
/usr/local/lib/python2.7/pdb.py: return Pdb().runeval(expression, globals, locals)
/usr/local/lib/python2.7/pprint.py: """Determine if saferepr(object) is readable by eval()."""
/usr/local/lib/python2.7/rexec.py:The class RExec exports methods r_exec(), r_eval(), r_execfile(), and
/usr/local/lib/python2.7/rexec.py:exec, eval(), execfile() and import, but executing the code in an
/usr/local/lib/python2.7/rexec.py: def r_eval(self, code):
/usr/local/lib/python2.7/rexec.py: return eval(code, m.__dict__)
/usr/local/lib/python2.7/rexec.py: def s_eval(self, *args):
/usr/local/lib/python2.7/rexec.py: Similar to the r_eval() method, but the code will be granted access
/usr/local/lib/python2.7/rlcompleter.py: thisobject = eval(expr, self.namespace)
/usr/local/lib/python2.7/warnings.py: cat = eval(category)
You'll note that most of the actual calls to eval are in the Python
debugger, pdb, which makes sense.
Looking one directory down, I get a further 260 such instances, 224 of
which are in the "test" subdirectory:
[steve at ando ~]$ grep "eval(" /usr/local/lib/python2.7/*/*.py | wc -l
260
[steve at ando ~]$ grep "eval(" /usr/local/lib/python2.7/test/*.py | wc -l
224
Digging deeper still, I find that IDLE also includes many calls to
eval(), as does the turtle graphics module (which is old and hasn't had
much love for a long time). There is also a large test suite with many
calls to eval() in 2to3, as well as many hundreds of false positives,
e.g. sympy defines dozens of classes with an eval method.
Since these results depend on what third-party libraries have been
installed, your results may vary.
--
Steven
More information about the Tutor
mailing list