首页 > 解决方案 > 使用 set() 函数使用无限 *args 的自定义方法?

问题描述

我正在做一些项目,我们有很多这样的代码用法;

    # 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) 

但是我的自定义方法返回的值与以前不同。我怎样才能做到这一点?

标签: pythondjangofunction

解决方案


|对集合的操作返回它们的并集。你想要的是区别(-

def _get_deleted_lists(*lists):
   if not lists:
       return set()
   result = set(lists[0])
   for l in lists[1:]:
       result -= set(l)
   return result

推荐阅读