Pergunta

Estou procurando uma maneira de retornar True ou uma string e, posteriormente, use essas informações para mostrar algo ou não. Aqui está o meu 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)

Então mais tarde eu uso:

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

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

E finalmente no meu modelo:

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

De alguma forma, eu sempre acabo no mesmo que o time_remaining retorne a string em vez de verdadeiro

Como posso resolver este problema?

Foi útil?

Solução

Em strings não vazios de Python também avaliam como True:

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

Então, não importa qual seja o seu time_remaining Retornos de função, sempre serão avaliados como True na tua if declaração.

Você provavelmente quer usar algo como:

time_remaining() == True

Ou talvez até tenha time_remaining Retorna False ou None Se não houver tempo (especialmente se você for apenas usar a saída de time_remaining na tua if declaração).

Outras dicas

time_remaining() == True:

Parece que isso faz o truque :) imaginei que sempre retorna algo alguma explicação do que exatamente está acontecendo

Sua time_remaining a função sempre retorna um valor que avalia para True no if declaração. Então possible sempre será True.

Adicione uma lógica extra no seu segundo bloco de código para fazer o comportamento que você espera, como testar o valor do Delta do tempo.

As saídas da função devem ser do mesmo tipo, com o valor especial 'nenhum' para informar uma saída vazia (embora eu não consiga encontrar nenhuma referência para esta declaração ...).

Então, você deve fazer:

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 retornar alguns valores: o primeiro diz o tipo de resultado, o segundo é o resultado real

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top