2017-02-28 4 views
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에 삽입해야하는 것의 좋은 예가 무엇입니까?

+0

내가 너희에게 쓰고 있어요 :

그래서 코드에서, 당신은 단순히 줄을 제거해야합니다. 여기에 좋은 결과를 얻으려면 관찰해야 할 몇 가지 원칙이 있습니다. (1) 발생한 어려움을 설명하기 위해 필요한 최소한의 코드 길이를 줄여보십시오. (2) 관련 문서를 읽고 이전 답변을 찾아 스스로 대답을 찾을 수 있는지 확인하십시오. (당신은 당신의 첫 번째 질문에 대한 답을 얻을 수 있어야합니다.) (3) 코드가 원하는 것을 정확하게하려고 노력하십시오. 이 경우 '전달'하고 싶은 결과가 무엇이겠습니까? –

답변

0

self.delta 인스 턴스에서 액세스 할 수있는 클래스 속성입니다. 이 속성 self.delta = 12을 무시하면 인스턴스 속성이됩니다. 이 첫 번째 질문은 SO에 있기 때문에 리뷰어로

if isinstance(args[0], timedelta): 
    self.delta = delta