2017-09-01 17 views
0

私は数ヶ月間Python 2を使用していましたが、eval()を使用して変数を動的に設定しています。たとえば、私のPythonコードですべてが突然動作しない

今日、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

+4

最初は 'eval()'を使用しないでください。また、タイプミスがあります。あなたは 'what2plot =" num "'の代わりに 'what2pot =" num "'を書きました – stybl

+6

あなたは "一般的にeval()"を使っていますか?あなたは(ほぼ)evalを使うべきではありません。 – melpomene

+3

"は変数を動的に設定するためにeval()を使うのが一般的です。" **こんなことしないで**。遅く、非効率的で、バグを求めています。 –

答えて

3

あなたのコードは、通常の組み込みeval機能を実行していないので、あなたが期待するとして働いて、代わりにpandasから機能しません。おそらくfrom some_module import *というステートメントを持っていて、パンダ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] 
+0

パーフェクト。これはまさに問題であり、これは明確な選択肢です。ありがとう! – pavlov

関連する問題