Soy bastante nuevo en Python e intento encontrar una mejor manera de codificar esto. Tiene que haber una manera, pero no estoy seguro de cómo hacerlo.

Las dos consultas son esencialmente las mismas, por lo que tiene que haber una forma de reducir. ¿Hay una manera más eficiente de hacer esto?

        if set_date is not None:

            if is_rejected != 'true':
                query = query\
                    .filter(createddate__lte=set_date) \
                    .car_statuses(CarTow.TOWED) \
                    .order_by('-createddate')
            else:
                query = query\
                    .filter(createddate__lte=set_date) \
                    .car_statuses(CarTow.TOWED,CarTow.CONFIRMED) \
                    .order_by('-createddate')

            return query

Lo siento si esta es una pregunta simple, novato aquí.

1
SteveV 2 oct. 2019 a las 01:32

3 respuestas

La mejor respuesta

Puede simplificar sacando el argumento que difiere en la declaración if y dejando afuera las cosas comunes.

if set_date is not None:
       if is_rejected != 'true':
             car_statuses = (CarTow.TOWED,)
       else:
             car_statuses = (CarTow.TOWED, CarTow.CONFIRMED)

       query = query\
           .filter(createddate__lte=set_date) \
           .car_statuses(*car_statuses) \
           .order_by('-createddate')
      return query
2
rdas 1 oct. 2019 a las 22:37

Puede usar la lógica ternaria para agregar las tuplas.

query = (
    query
    .filter(createddate__lte = set_date) 
    .car_statuses((CarTow.TOWED,) + ((CarTow.CONFIRMED,) if is_rejected == 'true' else ()) 
    .order_by('-createddate')
)
2
Alexander 1 oct. 2019 a las 23:04

Probablemente quieras reemplazar esto:

if set_date is not None:

Con esto:

if set_date:

Eche un vistazo a cómo Python evalúa el if condicional: Prueba del valor de la verdad (pydocs)

Aquí están la mayoría de los objetos incorporados considerados falsos: constantes definidas como falsas: ninguna y falsa. cero de cualquier tipo numérico: 0, 0.0, 0j, Decimal (0), Fracción (0, 1) secuencias y colecciones vacías: '', (), [], {}, set (), rango (0)

Además, 'es' puede dar algunos resultados extraños, es realmente para determinar si dos etiquetas hacen referencia al mismo objeto o no. Entendiendo que Python es el operador

1
neutrino_logic 1 oct. 2019 a las 22:59
58193085