Frage

Ich suche nach einer Möglichkeit, zurückzukehren True oder eine Zeichenfolge und verwenden Sie später diese Informationen, um etwas zu zeigen oder nicht. Hier ist mein Code:

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)

Dann benutze ich später:

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

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

Und schließlich in meiner Vorlage:

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

Irgendwie lande ich immer an der, auch wenn die Time_Remaining die Zeichenfolge statt wahr zurückgibt

Wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

In Python-nicht-leer-Zeichenfolgen werden auch auch als bewertet True:

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

Also egal was du bist time_remaining Funktionsrenditen, es wird immer als bewertet als True in deiner if Aussage.

Sie möchten wahrscheinlich so etwas verwenden wie:

time_remaining() == True

Oder vielleicht sogar haben time_remaining Rückkehr False oder None Wenn keine Zeit übrig ist (insbesondere wenn Sie nur die Ausgabe von verwenden möchten time_remaining in deiner if Aussage).

Andere Tipps

time_remaining() == True:

Das scheint der Trick :) Es gab immer etwas zurück, was genau zu erklären, was genau los ist, würde immer noch abgeschrieben werden

Dein time_remaining Funktion gibt immer einen Wert zurück, der bewertet True in dem if Aussage. So possible wird immer sein True.

Fügen Sie in Ihrem zweiten Codeblock eine zusätzliche Logik hinzu, um das erwartete Verhalten zu erfüllen, z. B. den Wert des Zeitdeltas.

Funktionsausgänge sollten vom gleichen Typ sein, wobei der besondere Wert 'None' eine leere Ausgabe mitteilen kann (obwohl ich keine Referenz für diese Anweisung finden kann ...).

Also sollten Sie tun:

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

oder:

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

oder:

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

Oder geben Sie ein paar Werte zurück: Die erste sagt die Art von Ergebnis, das zweite ist das tatsächliche Ergebnis

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top