Пользовательский метод для неограниченного числа аргументов с использованием функции set ()? - PullRequest
0 голосов
/ 13 октября 2018

Я работаю над каким-то проектом, и у нас много такого кода, как этот;

    # filtering fields are different from each other, please ignore the similarity below

def function1(self, param):
    list_x = Model1.objects.filter(foo=bar, bla=bla).values_list('field', flat=True)
    list_y = Model2.objects.filter(foo=bar, bla=bla).values_list('field', flat=True)
    lists_to_delete = set(list_x) - set(list_y) 
    # here is the code line with set() that needed to be method

    self._delete(lists_to_delete)

def function2(self, param):
    list_z = Model3.objects.filter(foo=bar, bla=bla).values_list('field', flat=True)
    list_q = Model4.objects.filter(foo=bar, bla=bla).values_list('field', flat=True).distinct()
    list_w = Model5.objects.filter(foo=bar, bla=bla).values_list('field', flat=True)
    lists_to_delete = set(list_x) - set(list_y) - set(list_w)
    # here is the code line with set() that needed to be method

    self._delete(lists_to_delete)

... # other functions continues like above
...
...

Итак, как вы можете видеть, у нас такое же использование с функцией set().И мне нужно изменить это использование с пользовательским методом.Я пытался написать метод, подобный этому;

def _get_deleted_lists(self, *args):
   value = set()
   for arg in args:
       value |= set(arg)
   return value

, и использование будет меняться как;

lists_to_delete = self._get_deleted_lists(list_x, list_y, ...)

вместо этого;

lists_to_delete = set(list_x) - set(list_y) 

Но мой заказметод не возвращает то же значение, что и раньше.Как мне этого добиться?

1 Ответ

0 голосов
/ 13 октября 2018

| операция над множествами возвращает их объединение.То, что вы хотите, это разница (-)

def _get_deleted_lists(*lists):
   if not lists:
       return set()
   result = set(lists[0])
   for l in lists[1:]:
       result -= set(l)
   return result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...