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