2012-05-11 9 views
3

私は汎用フレームワークで作業していますが、ある時点では一般的な方法で変数をフィルタリングしようとしています。たとえば次のクラスを取る:一般的に文字列としてのラムダ関数を持つPythonオブジェクト配列の値をフィルタリングします。

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

+0

'isint()'関数を書いて 'process(" lambda x:x.val if isint(x.val)else None "、" arr ")'を実行できますか? –

+0

私はそれについて考えましたが、もし私が他のものを見つけなければ、おそらくこれで解決しなければならないでしょうが、私はラムダ文字列がメソッドを定義したことを知らないユーザによって定義されているので、いわゆるisintです。もちろん、これはドキュメンテーションやコメントの一部で、ユーザーに知らせることができますが、これを行うためのよりよい方法があるかどうかを知りたかったのですが、それ以外の場合はおそらく私がしなければならないことです。 –

+0

そのような変数名は使用せず、そのようなクラスは使用しないでください。ユーザーの入力としてキーを使用してdictを使用し、フィルタリングする値として値を使用します – Daenyth

答えて

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%保証はありません。それは有効なPythonである123Lをとらない。

0

番号がある場合.isdigit()メソッドが失敗すること[1、2、3、5]

...私は戻って取得

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

...これを試してみてくださいカンマまたは小数点で指定します。

関連する問題