我已经使用Python2好几个月了,通常使用eval()动态设置变量。例如:
num_ls = [1,2,3]
let_ls = ['a', 'b', 'c']
what2plot = 'num'
list2plot = eval(what2plot + '_ls')
今天,当我使用eval()时,我今天编写的所有代码都会突然出错。在
错误是:
Traceback (most recent call last):
File "", line 1, in list2plot = eval(what2plot + '_ls')
File "/anaconda/lib/python2.7/site-packages/pandas/computation/eval.py", line 266, in eval ret = eng_inst.evaluate()
File "/anaconda/lib/python2.7/site-packages/pandas/computation/engines.py", line 76, in evaluate res = self._evaluate()
File "/anaconda/lib/python2.7/site-packages/pandas/computation/engines.py", line 123, in _evaluate return ne.evaluate(s, local_dict=scope, truediv=truediv)
File "/anaconda/lib/python2.7/site-packages/numexpr/necompiler.py", line 789, in evaluate zip(names, arguments)]
File "/anaconda/lib/python2.7/site-packages/numexpr/necompiler.py", line 686, in getType raise ValueError("unknown type %s" % a.dtype.name)
ValueError: unknown type unicode1792
您的代码没有按预期工作,因为您没有运行正常的内置
eval
函数,而是运行pandas
中的函数。您可能有一个from some_module import *
语句,它将pandaseval
函数引入到命名空间中,并在其中隐藏内置函数。在有很多方法可以解决这个问题。在
最简单的可能就是不做这种导入。另一个选择是执行
del eval
,这将从您的名称空间中删除导入的函数,从而使内置函数再次可见。您还可以从builtins
模块中再次导入它(对于python2,__builtin__
)也可以导入它。在但更好的方法可能是根本不使用
eval
。如果遇到任何问题,它是不安全的、缓慢的和难以调试的。更好的选择是使用字典在字符串和列表之间进行映射:相关问题 更多 >
编程相关推荐