我已经使用Python 2几个月了,通常使用eval()来动态设置变量 . 例如:
num_ls = [1,2,3]
let_ls = ['a', 'b', 'c']
what2plot = 'num'
list2plot = eval(what2plot + '_ls')
今天,当我使用eval()时,今天写的所有代码突然出现错误 .
错误是:
回溯(最近一次调用最后一次):文件“”,第1行,在list2plot = eval(what2plot'_ls')文件“/anaconda/lib/python2.7/site-packages/pandas/computation/eval.py”,第266行,在eval ret = eng_inst.evaluate()文件“/anaconda/lib/python2.7/site-packages/pandas/computation/engines.py”,第76行,在评估res = self._evaluate()文件“ /anaconda/lib/python2.7/site-packages/pandas/computation/engines.py“,第123行,在_evaluate中返回ne.evaluate(s,local_dict = scope,truediv = truediv)文件”/ anaconda / lib / python2 .7 / site-packages / numexpr / necompiler.py“,第789行,在评估zip(名称,参数)中]文件”/anaconda/lib/python2.7/site-packages/numexpr/necompiler.py“,第686行,在getType中引发ValueError(“unknown type%s”%a.dtype.name)ValueError:unknown type unicode1792
1 回答
你的代码不是运行正常的内置
eval
函数,而是运行pandas
中的函数 . 你可能有一个from some_module import *
语句将pandaseval
函数带入你隐藏内置函数的命名空间 .您可以通过多种方式解决此问题 .
最简单的可能是不进行导入 . 另一种选择是执行
del eval
,它将从命名空间中删除导入的函数,允许内置函数再次可见 . 您也可以从builtins
模块(或Python的__builtin__
)再次导入它 .但更好的方法可能是根本不使用
eval
. 如果您遇到任何问题,它是不安全,缓慢且难以调试的 . 更好的选择是使用字典在字符串和列表之间进行映射: