0

**kwargs関数に渡される引数をフィルターのように使用したいと考えています。つまり、オブジェクトの属性が要素である場合にのみn== vリストに追加する必要があります。

私の現在のソリューションは次のようになります。これを行うより良い方法はありますか?私にはかなりハッキーに見えます。

def filter_nodes(self, **kwargs):
    r = []
    for n in self.pcode:
        for k,v in kwargs.iteritems():
            if getattr(n,k) == v:
                sign  = True
            else:
                sign = False
        if sign is True:
            r.append(n)
    return r

アップデート

これが現在の関数の外観です。有益なコメントをありがとう。

def filter_nodes(self, **kwargs):
    bib = {'eq': '==','gt': '>','st': '<','geqt': '>=','seqt': '<=', 'neq':'!=' } 
    r = [] 
    for n in d:
        if all(eval('%s%s%s' % (getattr(n,k),bib[v[1]], v[0])) for k,v in kwargs.iteritems()):
            r.append(n)
     return r
4

1 に答える 1

3

これには同じ機能があると思います:

def filter_nodes(self, **kwargs):
    return [n for n in self.pcode 
            if all(getattr(n, k) == v for k, v in kwargs.iteritems())]

UPDATE : 実際にはそうではありません。すべての属性が kwargs で見つかった値と等しい必要がありますが、スニペットでは kwargs の最後のキーと値のペアが n を追加できるかどうかを決定します。おそらく、追加が許可される正確な条件を指定する必要があります。

于 2013-08-14T10:09:02.223 に答える