Pregunta

Estoy buscando una forma de regresar True o una cadena, y luego use esa información para mostrar algo o no. Aquí está mi código:

def time_remaining(self):
    timer = self.timer
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    if timer < now:
        return True
    else:
        #Returns a timedelta in string
        return game_logic.timedelta_format(timer - now)

Luego, más tarde uso:

if time_remaining():
    possible = True
else:
    possible = False

return render(request, 'training.html',{'possible': possible})

Y finalmente en mi plantilla:

{% if possible %}
    <some html>
{% else %}
    <different html>
{% endif %}

De alguna manera siempre termino en el incluso si el tiempo de tiempo devuelve la cadena en lugar de verdad

¿Como puedo solucionar este problema?

¿Fue útil?

Solución

En Python, las cadenas no vacías también evalúan como True:

>>> bool('foo')
True
>>> bool('')
False

Así que no importa cuál sea tu time_remaining retornos de funciones, siempre se evaluará como True en tus if declaración.

Probablemente quieras usar algo como:

time_remaining() == True

O tal vez incluso tener time_remaining devolver False o None Si no queda tiempo (especialmente si solo va a usar la salida de time_remaining en tus if declaración).

Otros consejos

time_remaining() == True:

Parece que el truco :) Pensé que siempre devuelve algo que explica exactamente lo que está sucediendo exactamente sería apretado

Su time_remaining la función siempre devuelve un valor que evalúa True en el if declaración. Asi que possible siempre será True.

Agregue una lógica adicional en su segundo bloque de código para hacer el comportamiento que espera, como probar el valor del delta del tiempo.

Las salidas de la función deben ser del mismo tipo, con el valor especial 'Ninguno' para indicar una salida vacía (aunque no puedo encontrar ninguna referencia para esta declaración ...).

Entonces, deberías hacer:

if timer < now:
    return game_logic.timedelta_format(empty_timedelta) 
else:
    #Returns a timedelta in string
    return game_logic.timedelta_format(timer - now)

o:

time_limit = min(timer, now) #if 'min' applies
return game_logic.timedelta_format(timer - time_limit ) 

o:

if timer < now:
    return None
else:
    #Returns a timedelta in string
    return game_logic.timedelta_format(timer - now)

o devolver un par de valores: el primero dice el tipo de resultado, el segundo es el resultado real

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top