eval()突然无法在我的所有python代码中工作

时间:2017-09-01 22:49:22

标签: python python-2.7 eval

我几个月来一直在使用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

1 个答案:

答案 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]