2016-10-31 17 views
1

文字列のコンテキストに基づいて比較マーカーを置換したいと思います。私はPython 3.5でのPyQt5実験の一部をしています。例えばPython比較エバリュエーター置換

line = "<" 

if 1 line 2: 
    print("False") 

は、これを行うための簡単な方法はありますか?私は、次のようなテストケースを使用したとみなさ:

if line == "<": 
    if 1 < 2: 
     print("False") 

など、など、これは「if」ステートメント特に反復して、長くなります。 例:

if pt1 < pt1_target: 
    if pt2 > pt2_target: 
     etc. 

それともこれが不可能な場合は、誰もが巨大なを避けるために、すべてのソリューションを持っていない、各ブランチの文ブロック「場合」 - すべてをキャッチ? lineが正しい"=="の代わりに"="のような、正しいpythonの同等のものに置き換えられるように、少し指示を入れようとします。

ありがとうございます!

+1

チェックをそれはあなたがロジックの周りに切り替えることができ、次に何をしたいかどう - あなたの例では、1 < 2Falseに評価されますようにロジックを否定するように見えましたまた[演算子をPython関数に渡す方法は?](http://stackoverflow.com/questions/18591778/how-to-pass-an-operator-to-a-python-function)、[演算子を変数に代入するpythonで?](http://stackoverflow.com/questions/2983139/assign-operator-to-variable-in-python) – user2314737

答えて

3

operatorモジュールから関数を使用してください:あなたはoperatorモジュールに対応する機能にオペレータの文字列をマップするために辞書を使用することができます

from operator import eq, ne, lt, le, gt, ge 

operator_functions = { 
    '=': eq, 
    '!=': ne, 
    '<': lt, 
    '<=': le, 
    '>': gt, 
    '>=': ge, 
} 

operator = # whatever 

if operator_functions[operator](a, b): 
    do_whatever() 
+0

これは、「= ':eq'は、実行していない標準のPython演算子構文に準拠するには? –

+1

@tobias_k:それは、入力が '=='の代わりに '='を使うような質問から聞こえたので、意図的でした。私はおそらくそれについてのコメントや何かを入れておくべきでしょう。 – user2357112

+0

@ user2357112私は、オペレータが見えるようにするための指示を追加する必要はないと思っています。ありがとう! – MadisonCooper

2

import operator 

ops = {'>': operator.gt, 
     '<': operator.lt, 
     '==': operator.eq, 
     # etc... 
     } 

op_string = '<' 
if ops[op_string](1, 2): 
    print('True') 
# or this... 
print(ops[op_string](1, 2)) 

(注)この例のプリントは、そのTrue

if ops[op_string](1, 2): 
    print 'False' 
# or this... 
print(not ops[op_string](1, 2)) 

それとも、オペレータのマッピング変更することができます::

ops = {'<': operator.ge, ...} 
print(ops[op_string](1, 2)) 
# False