0

**kwargs我想像过滤器一样使用传递给我的函数的参数。也就是说,只有当对象的属性n== v元素时,才应该将其附加到列表中。

我目前的解决方案看起来像这样。有没有更好的方法来做到这一点?对我来说看起来很hacky。

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())]

更新:实际上,它不会,它将要求所有属性与 kwargs 中找到的值相等,而在您的代码段中,kwargs 的最后一个键/值对将决定是否可以添加 n。也许您应该指定允许添加它的确切条件。

于 2013-08-14T10:09:02.223 回答