次のコードがあるとします。
def process(x, y, op):
if op == 'eq':
return x == y
elif op == 'gt':
return x > y
elif op == 'lt':
return x < y
... for many more operators, e.g. >=, <=, !=
これをよりプログラム的に抽出するにはどうすればよいですか?私は次のようなルックアップを作成することを考えています:
op_lookup = {'eq': '==', 'gt': '>', 'lt': '<', ...}
次に、次のようなことを行います。
def process(x, y, op):
return x op_lookup[op] y
これは明らかに有効なPythonではありません...
のようなものeval
が機能する可能性があります:
def process(x, y, op):
return eval('{} {} {}'.format(x, op_lookup[op], y))
例では、これが生成されます。
>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False
これを達成するためのより良い(より安全な?)方法はありますか?
呼び出し可能オブジェクトとしての演算子は、operator
モジュール内に隠されています。getattr
組み込みの名前で特定の演算子に動的にアクセスできます。
デモ:
>>> import operator
>>> getattr(operator, 'eq')(1, 1)
True
>>> getattr(operator, 'eq')(1, 2)
False
>>> getattr(operator, 'lt')(1, 2)
True
>>> getattr(operator, 'lt')(2, 1)
False
これを使用して、関数を次のように書き直すことができます。
import operator
def process(x, y, op):
return getattr(operator, op)(x, y)
(必要に応じてサニティチェックを追加します。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加