функция фильтра возвращает разные результаты, когда она должна возвращать одинаковые - PullRequest
0 голосов
/ 07 мая 2019

Я должен искать некоторые данные по многим фильтрам и получать результаты, поэтому я объединяю вызовы фильтров, по одному для каждого фильтра. У меня много фильтров, которые логически одинаковы: чтобы проверить, имеет ли атрибут какое-то конкретное значение. Поэтому я подумал о написании некоторого общего кода для решения этой проблемы вместо того, чтобы повторять одну и ту же строку много раз (стандартное решение). Проблема в том, что этот общий код не работает должным образом, и я не могу понять, почему. Чтобы было ясно, я смог решить эту проблему с помощью стандартного решения, но мне очень любопытно понять причину этого вопроса.

Я использую Python 3.6.7

Это мой класс продуктов. У него гораздо больше атрибутов, но я не буду их здесь вставлять, потому что они не связаны

class ProductModel(object):
    def __init__(self, maker, supplier, trademark):
        self.maker = maker
        self.supplier = supplier
        self.trademark = trademark

Здесь я инициализирую переменные результата со всеми продуктами (класс ProductModel)

result = self.products.values()

Теперь я начинаю применять функции фильтра. Следующий код вызывает у меня проблемы:

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)

Последний работает, как и ожидалось. Насколько мне известно, первый метод должен делать то же самое. Однако это не так. Фильтры представляются в виде dict с именами атрибутов в качестве ключей и желаемыми значениями в качестве значений. Поведение и результаты в основном неожиданные. Иногда это работает как положено, но в большинстве случаев возвращает пустой объект фильтра, когда это не должно быть.

...