関数内で評価するために、関数に不等式を渡す必要があります。文字列として渡された場合に不等式を評価する方法はありますか?または、不等式の表現を渡し、if / elseステートメントを使用して符号を生成する必要がありますか?
2 に答える
モジュールを使用してoperator
、適切なメソッドを渡すことができます。
import operator
def check(op, a, b)
return op(a,b)
op = operator.ne
check(op, 2,3)
>>> True
あなたの質問は少し曖昧ですが、式(など)を含む文字列を評価したいようですx > 5
。これを行うのではなく、不必要に複雑で、セキュリティ上の問題が発生する可能性があるため、従来の方法またはラムダを使用して関数を定義するだけです。
def gt5(x):
return x > 5
また
gt5 = lambda x: x > 5
これらは両方とも同等です。今、あなたはgt5
好きなように回ることができます、そして時が来たら、あなたはそれを単に呼ぶだけです
y = 6
if gt5(y):
...
Gerratの回答が示唆しているように、オペレーターモジュールはこのような場合にも役立つ可能性があります。
ユーザー文字列を処理していることがわかったので、文字列を関数にマップする辞書を作成することをお勧めします。(おそらくそれはあなたのタイトルであなたが意味したことですか?)ユーザーランドの文字列をに渡すことgetattr
は多くの点で悪いようです。の属性に対応しない文字列を追加したい場合はどうなりますoperator
か?ユーザーがプライベート属性に対応する文字列を渡すとどうなりますか?文字列を関数にマッピングするカスタム辞書を作成することをお勧めします。dictを使用すると、受け入れる文字列だけを指定できます。
func_dict = {
'lt' : operator.lt,
'gt' : operator.gt,
'nand' : lambda x, y: not (x and y)
}
getattr
+operator
を使用して、受け入れたい文字列のリストからdictを作成することで、作業を節約できます。何かのようなもの:
func_dict = dict((s, getattr(operator, s)) for s in ['lt', 'gt'])
func_dict
次に、次のように更新します。
custom_dict = {
'nand' : lambda x, y: not (x and y)
}
func_dict.update(custom_dict)
そこから、次のようにdictで関数を簡単に呼び出すことができます。
>>> func_dict['lt'](5, 7)
True