سؤال

أنا أبحث عن طريقة للعودة True أو سلسلة ، واستخدم هذه المعلومات لاحقًا لإظهار شيء أم لا. ها هو رمزتي:

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)

ثم في وقت لاحق استخدم:

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

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

وأخيرا في القالب الخاص بي:

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

بطريقة ما ، انتهى بي الأمر دائمًا حتى لو كان الوقت يرجع السلسلة بدلاً من الصحيح

كيف يمكنني حل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

في الأوتار غير الفارغة في بيثون أيضًا True:

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

لذلك بغض النظر عن ما الخاص بك time_remaining عوائد الوظيفة ، سيتم تقييمها دائمًا على أنها True في الخاص بك if بيان.

ربما تريد استخدام شيء مثل:

time_remaining() == True

أو ربما لديك time_remaining إرجاع False أو None إذا لم يتبق وقت (خاصة إذا كنت ستستخدم فقط إخراج time_remaining في الخاص بك if بيان).

نصائح أخرى

time_remaining() == True:

يبدو أن هذه الخدعة :) احسبت أنها تُرجع دائمًا شيئًا ما ما يجري بالضبط سيظل كذلك

لك time_remaining تعمل الوظيفة دائمًا على إرجاع القيمة التي تقيمها True في ال if بيان. لذا possible سوف تكون دائما True.

أضف بعض المنطق الإضافي في كتلة الكود الثاني الخاص بك للقيام بالسلوك الذي تتوقعه ، مثل اختبار قيمة الوقت الدلتا.

يجب أن تكون مخرجات الوظائف من نفس النوع ، مع القيمة الخاصة "لا شيء" لإخبار إخراج فارغ (على الرغم من أنني لا أستطيع العثور على أي مرجع لهذا البيان ...).

لذلك ، يجب أن تفعل:

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

أو:

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

أو:

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

أو إرجاع بضع قيم: الأول يروي نوع النتيجة ، والثاني هو النتيجة الفعلية

if timer < now:
    return (True, None)
else:
    #Returns a timedelta in string
    return (False, game_logic.timedelta_format(timer - now))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top