过滤器函数在应返回相同结果时将返回不同结果

时间:2019-05-07 19:42:21

标签: python-3.x lambda filtering getattr

我必须通过许多过滤器搜索一些数据并检索结果,因此我要链接过滤器调用,每个过滤器对应一个。我有许多过滤器在逻辑上是相同的:检查属性是否具有某些特定值。因此,我想到编写一些通用代码来处理该问题,而不是多次重复同一行(标准解决方案)。问题在于此通用代码无法正常工作,我不知道为什么。 要明确的是,我能够使用标准解决方案来解决此问题,但我很好奇理解此问题背后的原因。

我正在使用Python 3.6.7

这是我的产品类别。它具有更多属性,但由于它们无关,所以我不会在此处粘贴

result = self.products.values()

在这里,我正在使用所有产品(ProductModel的类)初始化结果变量

for key in ["maker", "supplier", "trademark"]:
    if filters[key] is not None:
        result = filter(lambda p: getattr(p, key) == filters[key], result)

现在,我开始应用过滤器功能。 以下代码是导致我出现问题的代码:

if filters["maker"] is not None:
    result = filter(lambda p: p.maker == filters["maker"], result)
if filters["supplier"] is not None:
    result = filter(lambda p: p.supplier == filters["supplier"], result)
if filters["trademark"] is not None:
    result = filter(lambda p: p.trademark == filters["trademark"], result)

这是我之前提到的标准解决方案:

<NoWarn>$(NoWarn);NU1605</NoWarn>

后者工作正常。据我所知,第一种方法应该做的完全一样。但是,事实并非如此。 过滤器表示为dict,属性名称为键,期望值为值。 行为和结果大多是意外的。有时,它可以按预期工作,但是大多数情况下,它在不应该返回空过滤器对象的情况下。

0 个答案:

没有答案