2017-07-17 24 views
0

次のコードのためにevalを使用しないようにする簡単な方法があれば、私は疑問に思って:代替文字列式を評価するための()evalに

eval('6001 >= 6005') 

私はシンプルを見つけようカップルの時間を探してきたが、 evalを学習した後の代替案は、特に誰がプログラムを使用するのか分からないときは、良い習慣ではありません。

本の私の使用背景にはこのようなものである:それはまた次のようになりますので

2つの比較変数の各

は、パンダのデータフレームの列の値になります。

eval('"my_city_name" == "your_city_name"') 

何か助けていただければ幸いです!おかげ

+0

パンダのevalはeval関数とは異なります。それは危険ではない。しかし、 'query'やboolean indexingのような多くの選択肢があります。あなたはサンプルの入出力を表示する必要があります。 – ayhan

+0

はパンダの評価安全ですか?私は「pandas.eval(input())」のようなどこかで見たハックを試みました。出力はありませんでしたが、プログラムが凍結されたので、わかりませんでした。 – jGraves

+0

それは算術演算しかサポートしていないので、どのように危険なのかわかりません。あなたの入力は何ですか? – ayhan

答えて

1

は、あなたができるようにしたいの比較を実装することによりeval()を避けることができます:等々

STRINGS = ['6001 >= 6005', '"my_city_name" == "your_city_name"', '13 != 14', '1 < 4'] 

COMPARISONS = { 
    '==': lambda a, b: a == b, 
    '!=': lambda a, b: a != b, 
    '>=': lambda a, b: a >= b, 
} 

for string in STRINGS: 
    operand1, comparison, operand2 = string.split() 

    if comparison in COMPARISONS: 
     print(string, (COMPARISONS[comparison])(operand1, operand2)) 
    else: 
     print(string, "Unknown comparison") 

この一例であり、実際にあなたには、いくつかの型チェックを行う必要があると思い、数変換とをが、重要な点は、どの比較があなたにとって重要かを判断することです。ここで

+0

私もこのことを考えていましたが、私のアプリケーションでは、オペランドの1つに複数の単語があった場合に文字列が分割されないと簡単になりました。私はその事件に対処するロジックを持つことができたと思っていますが、ここで最初にチェックして、誰かがこれを回避するためにすばやく巧妙な方法を持っているかどうかを確認したかっただけです。助けてくれてありがとう! – jGraves

+0

は、 'eval()'の代わりにいくつかのさらなる研究をした後、私のアプリケーションに用意されたこれのスピンオフを終了しました。入力いただきありがとうございます! – jGraves

0

は私がになってしまったものです:私は、オペレータの選択数を必要とするので

def transform(self, attribute): 

    try: 
     attribute = float(attribute) 
     if math.isnan(attribute): 
      attribute = "NULL" 
      print type(attribute) 
      return attribute 
    except ValueError: 
     attribute = str(attribute) 

    print type(attribute) 
    return attribute 

def equals(self, attribute, value): 
    return self.transform(attribute) == self.transform(value) 

def not_equals(self, attribute, value): 
    return self.transform(attribute) != self.transform(value) 

def greater_than(self, attribute, value): 
    return self.transform(attribute) > self.transform(value) 

def greater_than_equal(self, attribute, value): 
    return self.transform(attribute) >= self.transform(value) 

def less_than(self, attribute, value): 
    return self.transform(attribute) < self.transform(value) 

def less_than_equal(self, attribute, value): 
    return self.transform(attribute) <= self.transform(value) 

、これは私が思い付くことができる最高のソリューションでした。 transform()は、私の特定のデータセットに遭遇したいくつかの比較の問題を処理することです。うまくいけば、これは将来誰かを助けることができます!誰かがコメントや提案をしている場合は、私に知らせてください。

関連する問題