0
class timetravel(object):
"""
Fast forward in time with simulated CRON jobs (used for unit testing)
"""
delta = None
def __init__(self, *args):
self.initial_now = datetime.now()
if isinstance(args[0], timedelta):
self.delta = delta
elif isinstance(args[0], datetime):
self.now = args[0]
if args[0] > self.initial_now:
self.delta = args[0] - self.initial_now
else:
self.delta = self.initial_now - args[0]
else:
print("Please provide a datetime or timedelta object as argument")
#self.now = self.initial_now
#self.freezer = freeze_time(self.now)
#self.freezer.start()
def __enter__(self):
# Traveling in the past, we don't run cron jobs backward
if self.now < self.initial_now:
self.now = self.now - self.delta
self.freezer = freeze_time(self.now)
self.freezer.start()
# Traveling in the future, run cron jobs
else:
self.now = self.initial_now
self.freezer = freeze_time(self.now)
self.freezer.start()
hours = self.delta.total_seconds()/60/60
weekday = self.now.weekday()
month = self.now.month
year = self.now.year
for i in range(1, int(hours)+1):
call_command('cron', hourly=True, verbosity=0)
if weekday != self.now.weekday():
weekday = self.now.weekday()
call_command('cron', daily=True)
if self.now.weekday() == 6 and weekday != self.now.weekday():
call_command('cron', weekly=True)
if self.now.month != month:
month = self.now.month
call_command('cron', monthly=True)
if self.now.year != year:
year = self.now.year
call_command('cron', yearly=True)
self.freezer.stop()
self.now = self.now + timedelta(hours=1)
self.freezer = freeze_time(self.now)
self.freezer.start()
return self.now
def __exit__(self, *args):
self.freezer.stop()
에 정의되지 않은, 내가델타 클래스
Traceback (most recent call last):
File "...", line 42, in test_timetravel
with timetravel(datetime.timedelta(days=2)) as now:
File ".../utils/testing.py", line 23, in __init__
self.delta = delta
NameError: global name 'delta' is not defined
를 얻을 내가 말할 수 없습니다.
2이 문제를 어떻게 해결할 수 있습니까? 사실, 내가 프로그래밍에있어 새로운 것입니다. 그렇다면 인수로
timetravel
에 삽입해야하는 것의 좋은 예가 무엇입니까?
내가 너희에게 쓰고 있어요 :
그래서 코드에서, 당신은 단순히 줄을 제거해야합니다. 여기에 좋은 결과를 얻으려면 관찰해야 할 몇 가지 원칙이 있습니다. (1) 발생한 어려움을 설명하기 위해 필요한 최소한의 코드 길이를 줄여보십시오. (2) 관련 문서를 읽고 이전 답변을 찾아 스스로 대답을 찾을 수 있는지 확인하십시오. (당신은 당신의 첫 번째 질문에 대한 답을 얻을 수 있어야합니다.) (3) 코드가 원하는 것을 정확하게하려고 노력하십시오. 이 경우 '전달'하고 싶은 결과가 무엇이겠습니까? –