Domanda

Sto cercando un modo per tornare True o una stringa, e in seguito usa quelle informazioni per mostrare qualcosa o no. Ecco il mio codice:

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)

Poi più tardi io uso:

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

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

E infine nel mio modello:

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

In qualche modo finisco sempre al anche se il time_remaining restituisce la stringa invece di vero

Come posso risolvere questo problema?

È stato utile?

Soluzione

Anche in python non le stringhe non vietano anche come True:

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

Quindi non importa quale sia il tuo time_remaining ritorni della funzione, verrà sempre valutato come True nel tuo if dichiarazione.

Probabilmente vuoi usare qualcosa di simile:

time_remaining() == True

O forse anche time_remaining Restituzione False o None Se non c'è più tempo (soprattutto se hai intenzione di utilizzare solo l'output di time_remaining nel tuo if dichiarazione).

Altri suggerimenti

time_remaining() == True:

Sembra che faccia il trucco :) Ho pensato che restituisca sempre qualcosa di spiegazione cosa sta succedendo esattamente sarebbe ancora acceso

Tuo time_remaining La funzione restituisce sempre un valore che valuta True nel if dichiarazione. Così possible sarà sempre True.

Aggiungi un po 'di logica extra nel secondo blocco di codice per fare il comportamento che ti aspetti, come testare il valore del Delta del tempo.

Le uscite della funzione dovrebbero essere dello stesso tipo, con il valore speciale "Nessuno" per dire un output vuoto (anche se non riesco a trovare alcun riferimento per questa affermazione ...).

Quindi, dovresti fare:

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 restituire un paio di valori: il primo dice il tipo di risultato, il secondo è il risultato effettivo

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top