我几个月来一直在使用Python 2,并且通常使用eval()来动态设置变量。例如:
num_ls = [1,2,3]
let_ls = ['a', 'b', 'c']
what2plot = 'num'
list2plot = eval(what2plot + '_ls')
今天,当我使用eval()时,今天写的所有代码突然出现错误。
错误是:
追踪(最近一次呼叫最后一次):
文件"",第1行,in 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中 return ne.evaluate(s,local_dict = scope,truediv = truediv)
File" /anaconda/lib/python2.7/site-packages/numexpr/necompiler.py", 第789行,正在评估中 zip(名称,参数)]
File" /anaconda/lib/python2.7/site-packages/numexpr/necompiler.py", 第686行,在getType中 提出ValueError("未知类型%s"%a.dtype.name)
ValueError:未知类型unicode1792
答案 0 :(得分:3)
您的代码无法按预期运行,因为您没有运行正常的内置eval
函数,而是运行pandas
中的函数。你可能有一个from some_module import *
语句将pandas eval
函数带入你隐藏内置函数的命名空间。
有多种方法可以解决这个问题。
最简单的可能就是不进行导入。另一种选择是执行del eval
,它将从命名空间中删除导入的函数,从而允许内置函数再次可见。您也可以从builtins
模块再次导入它(或Python 2的__builtin__
)。
但更好的方法可能是根本不使用eval
。如果您遇到任何问题,它是不安全,缓慢且难以调试的。一个更好的选择是使用字典在字符串和列表之间进行映射:
num_ls = [1,2,3]
let_ls = ['a', 'b', 'c']
selector_dict = {'num': num_ls, 'let': let_ls}
what2plot = 'num'
list2plot = selector_dict[what2plot]