Question

Je cherche un moyen de revenir True ou une chaîne, et utilisez plus tard ces informations pour afficher quelque chose ou non. Voici mon 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)

Puis plus tard j'utilise:

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

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

Et enfin dans mon modèle:

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

D'une manière ou d'une autre, je me retrouve toujours au même si le temps_reming renvoie la chaîne au lieu de vrai

Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

En python, les chaînes non vides évaluent également True:

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

Donc peu importe ce que vous time_remaining la fonction renvoie, il sera toujours évalué comme True dans ton if déclaration.

Vous voulez probablement utiliser quelque chose comme:

time_remaining() == True

Ou peut-être même avoir time_remaining revenir False ou None S'il ne reste plus de temps (surtout si vous n'utilisez que la sortie de time_remaining dans ton if déclaration).

Autres conseils

time_remaining() == True:

Il semble que cela fait l'affaire :) a pensé que cela renvoie toujours quelque chose que des explications ce qui se passe

Ton time_remaining La fonction renvoie toujours une valeur qui évalue True dans le if déclaration. Alors possible sera toujours True.

Ajoutez une logique supplémentaire dans votre deuxième bloc de code pour faire le comportement que vous attendez, comme tester la valeur de l'époque delta.

Les sorties de fonction doivent être du même type, avec la valeur spéciale «aucune» pour dire une sortie vide (bien que je ne trouve aucune référence pour cette instruction ...).

Donc, vous devriez faire:

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

ou:

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

ou:

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

ou renvoyer quelques valeurs: le premier raconte le type de résultat, le second est le résultat réel

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top