<p>通过编写具有明确定义用途的函数,您可以为自己(以及阅读您的代码的任何人,包括您未来的自己)提供帮助</p>
<p>例如:</p>
<pre><code>def get_status(self, user_time, start, end, breaks):
if not (start <= user_time <= end):
return 'time out'
else:
for start_break, end_break in breaks:
if start_break <= user_time <= end_break:
return 'break out'
return 'time in'
</code></pre>
<p>如果我正确理解了您的逻辑,这会给出正确的状态,例如:</p>
<pre><code>my_object.get_status(time(12, 10),
time(5, 0), time(17, 0),
[(time(10, 0), time(10, 15)),
(time(12, 0), time(13, 00)),
(time(15, 0), time(15, 15))])
</code></pre>
<p>(为清晰起见,请换行)</p>
<p>这将返回<code>'break out'</code>。然后,您可以从另一个方法中使用此方法,该方法对通过某个web表单返回的值执行某些操作—将处理表单的代码与测试某些业务规则的代码分离(即,随着时间的推移,状态如何)</p>
<p>由于您似乎并不需要工作日的开始和结束时间是可变的,也不需要休息时间,因此您可能希望将其移动到构造函数:</p>
<pre><code>from datetime import time
class MyClass:
def __init__(self, start, end, breaks):
self.start = start
self.end = end
self.breaks = breaks
def get_status(self, user_time):
if not (self.start <= user_time <= self.end):
return 'time out'
else:
for start_break, end_break in self.breaks:
if start_break <= user_time <= end_break:
return 'break out'
return 'time in'
obj = MyClass(time(5, 0), time(17, 0),
[(time(10, 0), time(10, 15)),
(time(12, 0), time(13, 00)),
(time(15, 0), time(15, 15))])
print(obj.get_status(time(12, 10)))
</code></pre>
<p>结果:</p>
<pre><code>break out
</code></pre>
<p>在您的情况下,可能类似于:</p>
<pre><code>from datetime import datetime, time
class MyClass:
def __init__(self, start, end, breaks):
self.start = start
self.end = end
self.breaks = breaks
# you probable have some code that sets this to a valid request
self.request = None
def get_status(self, user_time):
if not (self.start <= user_time <= self.end):
return 'time out'
else:
for start_break, end_break in self.breaks:
if start_break <= user_time <= end_break:
return 'break out'
return 'time in'
def set_time(self, fk):
user_time = datetime.strptime(self.request.POST['time'], '%I:%M:%S %p').time()
status = self.get_status(user_time)
# assuming this exists and works
TimeLogsModel.objects.create(date=fk,
time=self.request.POST['time'],
status=status)
# just returning the status because you did, not sure you even want that
return status
</code></pre>