Pekka Klärck <[email protected]> added the comment:
More ways to be bitten by this strange behavior:
>>> d = {'a': 1, 'b': 2}
>>> eval('[x[k] for k in x]', {}, {'x': d})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
File "<string>", line 1, in <listcomp>
NameError: name 'x' is not defined
>>>
>>> def f():
... x = {'a': 1, 'b': 2}
... return eval('[x[k] for k in x]')
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in f
File "<string>", line 1, in <module>
File "<string>", line 1, in <listcomp>
NameError: name 'x' is not defined
In both of the above cases changing
eval('[x[k] for k in x]')
to
eval('[v for v in x.values()]')
avoids the problem. There are no problems when using
[x[k] for k in x]
without `eval()` either. I'd prefer this to be changed, but there should at
least be a note in the documentation of `eval()` about this.
----------
nosy: +pekka.klarck
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue36300>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com