¿Qué significa este operador en django `reduce (operator.and_, query_list)`

Estoy leyendo estas preguntas

Construyendo consultas de filtros Django dinámicamente con args y kwargs

No puedo obtener lo que hace este operador

filter(reduce(operator.or_, argument_list))

o esto

filter(reduce(operator.and_, query_list))

filter es un método regular de Django Model Manager, por lo que no hay nada que explicar.

reduce es una función incorporada similar al código siguiente:

 def reduce(func, items): result = items.pop() for item in items: result = func(result, item) return result 

Donde func es una función definida por el usuario.

operator.or_ es una función de biblioteca estándar de python que envuelve el operador or . Es similar a este código:

 def or_(a, b): return a | b 

Por ejemplo:

 reduce(operator.or_, [False, False, True]) 

Volverá True .

En su contexto de ejemplo, los operadores or y and están sobrecargados y, por lo tanto, debe devolver una nueva consulta combinada de partes más pequeñas, todas concatenadas por or o and operador.

Los documentos de Python describen reduce como:

Aplicar una función de dos argumentos de forma acumulativa a los elementos de iterable, de izquierda a derecha, para reducir el iterable a un solo valor.

Por lo tanto, nos permite realizar una función sencilla y rápidamente (que toma dos parámetros, es decir, agregar a a b) varias veces en un conjunto de datos con una simple función de llamada.

En el caso de este problema de Django, queremos construir un solo objeto QuerySet tomando una lista de objetos de consulta individuales ( Q ) y realizando de forma acumulativa una operación AND u OR para obtener una sola consulta.

Por ejemplo, para las consultas [Q(1), Q(2), Q(3)] queremos OR Q(1) con Q(2) primero, y luego OR el resultado de esa operación con Q3 para darnos nuestra consulta final

Estamos acostumbrados a ver operaciones en python (como la sum o la resta) escritas como A + B (o en el caso de or’ing: A | B ) pero python también proporciona funciones para realizarlas (es decir, or(a, b) y and(a, b) que harían lo mismo). Estos son útiles en situaciones como estas, ya que pueden aplicarse como parámetros a otros métodos. Estas funciones como ‘agregar’, ‘restar’, etc. están en el módulo del operator .

Entonces, al usar el módulo de operators , vemos que reduce(operator.and_, query_list) está tomando cada objeto Q de nuestra lista, y “y ‘lo” con los resultados en curso de los objetos anteriores en la lista.