私は一般的なフレームワークに取り組んでおり、ある時点で一般的な方法で変数をフィルタリングしようとしています。たとえば、次のクラスを考えてみましょう。
class X:
def __init__(self, val):
self.val = val
val
次に、任意の値を持つオブジェクトの配列があります。
arr = [X("1"), X("2"), X("2"), X("3"), X("foo"), X("5"), X("3")]
私の目標は、ラムダ関数と変数名を文字列として受け取る関数(ユーザーが提供するため)を作成することです。これは現在、次のように実装されています。
def process(lambda_f_str, var_str):
# should return [1, 2, 3, 5]
return list(set(filter(lambda x: x, map(eval(lambda_f_str), eval(var_str)))))
これらのオブジェクトの一意の整数値のみを返す特定のラムダ関数文字列を使用してこのメソッドを呼び出せるようにしたいです(この例[1 2 3 5]
では、順序は関係ありません)。
私はこのようなことを試しました:
process("lambda x: x.val if isinstance(x.val, int) else None", "arr")
しかし、整数はまだ配列内の文字列として渡されるため、これは機能しません(そして、私はそれを制御できません。これはユーザー提供であるため、仮定することはできません)。
私は同等のことをしたかった
try:
int(x)
except:
# do something if not an int
しかし、ラムダ関数でそれを行うことはできないと思います...できますか?少なくとも私はその方法を知りませんでした。
このラムダを記述して、このフィルタリングを一般的な方法で実行する方法を知りたいと思います。process
これは、簡潔にするためにこのサンプルコードに含まれていない他のことを行うジェネリック関数であるため、メソッドの変更は避けたいと思います。