home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / contextlib.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  2.8 KB  |  107 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. import sys
  5. from functools import wraps
  6. from warnings import warn
  7. __all__ = [
  8.     'contextmanager',
  9.     'nested',
  10.     'closing']
  11.  
  12. class GeneratorContextManager(object):
  13.     
  14.     def __init__(self, gen):
  15.         self.gen = gen
  16.  
  17.     
  18.     def __enter__(self):
  19.         
  20.         try:
  21.             return self.gen.next()
  22.         except StopIteration:
  23.             raise RuntimeError("generator didn't yield")
  24.  
  25.  
  26.     
  27.     def __exit__(self, type, value, traceback):
  28.         if type is None:
  29.             
  30.             try:
  31.                 self.gen.next()
  32.             except StopIteration:
  33.                 return None
  34.  
  35.             raise RuntimeError("generator didn't stop")
  36.         if value is None:
  37.             value = type()
  38.         
  39.         try:
  40.             self.gen.throw(type, value, traceback)
  41.             raise RuntimeError("generator didn't stop after throw()")
  42.         except StopIteration:
  43.             exc = None
  44.             return exc is not value
  45.             if sys.exc_info()[1] is not value:
  46.                 raise 
  47.  
  48.  
  49.  
  50.  
  51. def contextmanager(func):
  52.     
  53.     def helper(*args, **kwds):
  54.         return GeneratorContextManager(func(*args, **kwds))
  55.  
  56.     helper = (wraps(func),)(helper)
  57.     return helper
  58.  
  59.  
  60. def nested(*managers):
  61.     warn('With-statements now directly support multiple context managers', DeprecationWarning, 3)
  62.     exits = []
  63.     vars = []
  64.     exc = (None, None, None)
  65.     
  66.     try:
  67.         for mgr in managers:
  68.             exit = mgr.__exit__
  69.             enter = mgr.__enter__
  70.             vars.append(enter())
  71.             exits.append(exit)
  72.         
  73.         yield vars
  74.     except:
  75.         exc = sys.exc_info()
  76.     finally:
  77.         while exits:
  78.             exit = exits.pop()
  79.             
  80.             try:
  81.                 if exit(*exc):
  82.                     exc = (None, None, None)
  83.             continue
  84.             exc = sys.exc_info()
  85.             continue
  86.  
  87.         if exc != (None, None, None):
  88.             raise exc[0], exc[1], exc[2]
  89.  
  90.  
  91. nested = contextmanager(nested)
  92.  
  93. class closing(object):
  94.     
  95.     def __init__(self, thing):
  96.         self.thing = thing
  97.  
  98.     
  99.     def __enter__(self):
  100.         return self.thing
  101.  
  102.     
  103.     def __exit__(self, *exc_info):
  104.         self.thing.close()
  105.  
  106.  
  107.