2011-02-25 4 views
2

文字列をPythonで演算子に変換できますか? 私は理想的には、次のようになり機能python文字列を演算子に変換する

に条件を渡すしたいと思います:

def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    if left_value get_operator(operator_string) right_value: 
     return True 
    else: 
     return False 

bar.x = 10 
bar.foo('x', '>', 10) 
[out] False 
bar.foo('x', '>=', 10) 
[out] True 

私はキーが文字列や値はoperatorモジュールの関数である辞書を作ることができます。 私は少しのfooの定義を変更する必要があります:これは私はこの辞書を作るために持っていることを意味、それは本当に必要です

operator_dict = {'>', operator.lt, 
       '>=', operator.le} 
def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    operator_func = operator_dict[operator_string] 
    if operator_func(left_value, right_value): 
     return True 
    else: 
     return False 

+0

管理可能な一連の演算子を使用している限り、辞書は正常です。 –

答えて

4

evalを使用すると、Pythonコードを動的に構築して実行することができますが、実際の選択肢はありません。しかし、辞書ベースのソリューションははるかにエレガントで安全です。

それ以外は、本当にですか?が悪いですか?あなたの代わりに「> =」の機能にoperator.le渡すことができない理由はなぜ

return operator_dict[operator_string](left_value, right_value) 
+0

私にevalを知らせてくれてありがとう。しかし、はい、あなたは正しいです、それはこの辞書を作成することは悪いことではありません。 – Ben2209

2

...それに問題は私が表示されていない指定されている方法を少し短くしません。

このoperator_stringがデータベースやファイルなどから来たものである場合、またはコード内でこのoperator_stringを渡している場合は、

bar.foo('x', operator.le , 10) 

便利な略記をお探しですか?ここでの本当の問題は、データベースまたはデータファイルから入ってくるコードやビジネスルールが多分あなたが実際にあなたをマッピングします少しパーサを書いて見てする必要がしているということであれば

from operator import le 
bar.foo('x', le, 10) 

:次に、あなたのような何かを行う可能性がありますこれらのオブジェクトに入力し、pyparsing、ply、codetalkerなどのライブラリを使用してみることができます。

+0

私は便利なショートカットの直後でした。だから、あなたのソリューションもいいと思う。そのおかげで。 – Ben2209

+0

あるいは、すべての代入文を書く必要がなく、 'from operator import eq、ne、gt、lt、le、ge'を実行するだけです。 – kindall

+0

@kindall:非常に良い点。 – stderr

関連する問題