1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import sys 6 7 _no_value = object() 8 9 class Future(object): 10 '''Stores a value, error, or delegate to be used later. 11 ''' 12 def __init__(self, value=_no_value, delegate=None): 13 self._value = value 14 self._delegate = delegate 15 self._exc_info = None 16 if (self._value is _no_value and self._delegate is None): 17 raise ValueError('Must have either a value or delegate.') 18 19 def Get(self): 20 '''Gets the stored value, error, or delegate contents. 21 ''' 22 if self._value is not _no_value: 23 return self._value 24 if self._exc_info is not None: 25 self._Raise() 26 try: 27 self._value = self._delegate.Get() 28 return self._value 29 except: 30 self._exc_info = sys.exc_info() 31 self._Raise() 32 33 def _Raise(self): 34 exc_info = self._exc_info 35 raise exc_info[0], exc_info[1], exc_info[2] 36