3

私は一般的なフレームワークに取り組んでおり、ある時点で一般的な方法で変数をフィルタリングしようとしています。たとえば、次のクラスを考えてみましょう。

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これは、簡潔にするためにこのサンプルコードに含まれていない他のことを行うジェネリック関数であるため、メソッドの変更は避けたいと思います。

4

2 に答える 2

0

これを試して...

s = "lambda x: int(x.val) if x.val.isdigit( ) else None"
print process(s, "arr")

私は戻ってきます...

[1、2、3、5]

.isdigit( )数値がコンマまたは小数で指定されている場合、メソッドは失敗することに注意してください。

于 2012-05-11T18:06:27.497 に答える
0

あなたは本当に評価が必要ですか?

f = lambda x: x.val if isinstance(x.val, int) else (int(x.val) if isinstance(x.val, basestring) and x.isdigit() else None)

100% の証明ではありません。たとえば、123Lどちらが有効な Python であるかはわかりません。

于 2012-05-11T18:08:40.517 に答える