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 
関連する問題