2017-09-01 1 views
0

J'utilise Python 2 depuis plusieurs mois maintenant, et j'utilise souvent eval() pour définir dynamiquement des variables. Par exemple:eval() ne fonctionne soudainement pas dans tout mon code python

num_ls = [1,2,3] 
let_ls = ['a', 'b', 'c'] 

what2plot = 'num' 
list2plot = eval(what2plot + '_ls') 

Aujourd'hui, tout mon code écrit ce jour frappe soudainement une erreur lors de l'utilisation eval().

L'erreur est:

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

+4

Vous ne devriez pas utiliser 'eval()' en premier lieu. En outre, vous avez une faute de frappe. Vous avez écrit 'what2pot =" num "' au lieu de 'what2plot =" num "' – stybl

+6

Que voulez-vous dire, vous "utilisez couramment eval()" ?! Vous ne devriez (presque) jamais utiliser eval. – melpomene

+3

"utilise couramment eval() pour définir dynamiquement des variables." **Ne faites pas cela**. Il est lent, inefficace et demande des bogues. –

Répondre

3

Votre code ne fonctionne pas comme prévu parce que vous n'êtes pas en cours d'exécution de la fonction normale builtin eval, mais plutôt une fonction de pandas. Vous avez probablement une instruction from some_module import * qui amène la fonction pandas eval dans votre espace de noms où elle cache la fonction interne.

Vous pouvez résoudre ce problème de plusieurs façons.

Le plus simple pourrait être de ne pas faire cette importation. Une autre option serait de faire del eval, ce qui supprimera la fonction importée de votre espace de noms, permettant à la fonction intégrée d'être à nouveau visible. Vous pouvez également l'importer à nouveau à partir du module builtins (ou __builtin__ pour Python 2).

Mais une meilleure approche est probablement de ne pas utiliser eval du tout. C'est dangereux, lent et difficile à déboguer si vous rencontrez des problèmes. Une meilleure alternative serait d'utiliser un dictionnaire pour mapper entre vos chaînes et vos listes:

num_ls = [1,2,3] 
let_ls = ['a', 'b', 'c'] 
selector_dict = {'num': num_ls, 'let': let_ls} 

what2plot = 'num' 
list2plot = selector_dict[what2plot] 
+0

Parfait. C'était exactement le problème et c'est une alternative claire. Merci! – pavlov