updated from Atlas
This commit is contained in:
92
15-context-mngr/mirror.py
Normal file
92
15-context-mngr/mirror.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
A "mirroring" ``stdout`` context.
|
||||
|
||||
While active, the context manager reverses text output to
|
||||
``stdout``::
|
||||
|
||||
# BEGIN MIRROR_DEMO_1
|
||||
|
||||
>>> from mirror import LookingGlass
|
||||
>>> with LookingGlass() as what: # <1>
|
||||
... print('Alice, Kitty and Snowdrop') # <2>
|
||||
... print(what)
|
||||
...
|
||||
pordwonS dna yttiK ,ecilA # <3>
|
||||
YKCOWREBBAJ
|
||||
>>> what # <4>
|
||||
'JABBERWOCKY'
|
||||
>>> print('Back to normal.') # <5>
|
||||
Back to normal.
|
||||
|
||||
# END MIRROR_DEMO_1
|
||||
|
||||
|
||||
This exposes the context manager operation::
|
||||
|
||||
# BEGIN MIRROR_DEMO_2
|
||||
|
||||
>>> from mirror import LookingGlass
|
||||
>>> manager = LookingGlass() # <1>
|
||||
>>> manager
|
||||
<mirror.LookingGlass object at 0x2a578ac>
|
||||
>>> monster = manager.__enter__() # <2>
|
||||
>>> monster == 'JABBERWOCKY' # <3>
|
||||
eurT
|
||||
>>> monster
|
||||
'YKCOWREBBAJ'
|
||||
>>> manager
|
||||
>ca875a2x0 ta tcejbo ssalGgnikooL.rorrim<
|
||||
>>> manager.__exit__(None, None, None) # <4>
|
||||
>>> monster
|
||||
'JABBERWOCKY'
|
||||
|
||||
# END MIRROR_DEMO_2
|
||||
|
||||
The context manager can handle and "swallow" exceptions.
|
||||
|
||||
# BEGIN MIRROR_DEMO_3
|
||||
|
||||
>>> from mirror import LookingGlass
|
||||
>>> with LookingGlass():
|
||||
... print('Humpty Dumpty')
|
||||
... x = 1/0 # <1>
|
||||
... print('END') # <2>
|
||||
...
|
||||
ytpmuD ytpmuH
|
||||
Please DO NOT divide by zero!
|
||||
>>> with LookingGlass():
|
||||
... print('Humpty Dumpty')
|
||||
... x = no_such_name # <1>
|
||||
... print('END') # <2>
|
||||
...
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
NameError: name 'no_such_name' is not defined
|
||||
|
||||
# END MIRROR_DEMO_3
|
||||
|
||||
"""
|
||||
|
||||
|
||||
# BEGIN MIRROR_EX
|
||||
class LookingGlass:
|
||||
|
||||
def __enter__(self): # <1>
|
||||
import sys
|
||||
self.original_write = sys.stdout.write # <2>
|
||||
sys.stdout.write = self.reverse_write # <3>
|
||||
return 'JABBERWOCKY' # <4>
|
||||
|
||||
def reverse_write(self, text): # <5>
|
||||
self.original_write(text[::-1])
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback): # <6>
|
||||
import sys # <7>
|
||||
sys.stdout.write = self.original_write # <8>
|
||||
if exc_type is ZeroDivisionError: # <9>
|
||||
print('Please DO NOT divide by zero!')
|
||||
return True # <10>
|
||||
# <11>
|
||||
|
||||
|
||||
# END MIRROR_EX
|
||||
64
15-context-mngr/mirror_gen.py
Normal file
64
15-context-mngr/mirror_gen.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""
|
||||
A "mirroring" ``stdout`` context manager.
|
||||
|
||||
While active, the context manager reverses text output to
|
||||
``stdout``::
|
||||
|
||||
# BEGIN MIRROR_GEN_DEMO_1
|
||||
|
||||
>>> from mirror_gen import looking_glass
|
||||
>>> with looking_glass() as what: # <1>
|
||||
... print('Alice, Kitty and Snowdrop')
|
||||
... print(what)
|
||||
...
|
||||
pordwonS dna yttiK ,ecilA
|
||||
YKCOWREBBAJ
|
||||
>>> what
|
||||
'JABBERWOCKY'
|
||||
|
||||
# END MIRROR_GEN_DEMO_1
|
||||
|
||||
|
||||
This exposes the context manager operation::
|
||||
|
||||
# BEGIN MIRROR_GEN_DEMO_2
|
||||
|
||||
>>> from mirror_gen import looking_glass
|
||||
>>> manager = looking_glass() # <1>
|
||||
>>> manager # doctest: +ELLIPSIS
|
||||
<contextlib._GeneratorContextManager object at 0x...>
|
||||
>>> monster = manager.__enter__() # <2>
|
||||
>>> monster == 'JABBERWOCKY' # <3>
|
||||
eurT
|
||||
>>> monster
|
||||
'YKCOWREBBAJ'
|
||||
>>> manager # doctest: +ELLIPSIS
|
||||
>...x0 ta tcejbo reganaMtxetnoCrotareneG_.biltxetnoc<
|
||||
>>> manager.__exit__(None, None, None) # <4>
|
||||
>>> monster
|
||||
'JABBERWOCKY'
|
||||
|
||||
# END MIRROR_GEN_DEMO_2
|
||||
|
||||
"""
|
||||
|
||||
|
||||
# BEGIN MIRROR_GEN_EX
|
||||
|
||||
import contextlib
|
||||
|
||||
|
||||
@contextlib.contextmanager # <1>
|
||||
def looking_glass():
|
||||
import sys
|
||||
original_write = sys.stdout.write # <2>
|
||||
|
||||
def reverse_write(text): # <3>
|
||||
original_write(text[::-1])
|
||||
|
||||
sys.stdout.write = reverse_write # <4>
|
||||
yield 'JABBERWOCKY' # <5>
|
||||
sys.stdout.write = original_write # <6>
|
||||
|
||||
|
||||
# END MIRROR_GEN_EX
|
||||
101
15-context-mngr/mirror_gen_exc.py
Normal file
101
15-context-mngr/mirror_gen_exc.py
Normal file
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
A "mirroring" ``stdout`` context manager.
|
||||
|
||||
While active, the context manager reverses text output to
|
||||
``stdout``::
|
||||
|
||||
# BEGIN MIRROR_GEN_DEMO_1
|
||||
|
||||
>>> from mirror_gen import looking_glass
|
||||
>>> with looking_glass() as what: # <1>
|
||||
... print('Alice, Kitty and Snowdrop')
|
||||
... print(what)
|
||||
...
|
||||
pordwonS dna yttiK ,ecilA
|
||||
YKCOWREBBAJ
|
||||
>>> what
|
||||
'JABBERWOCKY'
|
||||
|
||||
# END MIRROR_GEN_DEMO_1
|
||||
|
||||
|
||||
This exposes the context manager operation::
|
||||
|
||||
# BEGIN MIRROR_GEN_DEMO_2
|
||||
|
||||
>>> from mirror_gen import looking_glass
|
||||
>>> manager = looking_glass() # <1>
|
||||
>>> manager # doctest: +ELLIPSIS
|
||||
<contextlib._GeneratorContextManager object at 0x...>
|
||||
>>> monster = manager.__enter__() # <2>
|
||||
>>> monster == 'JABBERWOCKY' # <3>
|
||||
eurT
|
||||
>>> monster
|
||||
'YKCOWREBBAJ'
|
||||
>>> manager # doctest: +ELLIPSIS
|
||||
>...x0 ta tcejbo reganaMtxetnoCrotareneG_.biltxetnoc<
|
||||
>>> manager.__exit__(None, None, None) # <4>
|
||||
>>> monster
|
||||
'JABBERWOCKY'
|
||||
|
||||
# END MIRROR_GEN_DEMO_2
|
||||
|
||||
The context manager can handle and "swallow" exceptions.
|
||||
The following test does not pass under doctest (a
|
||||
ZeroDivisionError is reported by doctest) but passes
|
||||
if executed by hand in the Python 3 console (the exception
|
||||
is handled by the context manager):
|
||||
|
||||
# BEGIN MIRROR_GEN_DEMO_3
|
||||
|
||||
>>> from mirror_gen import looking_glass
|
||||
>>> with looking_glass():
|
||||
... print('Humpty Dumpty')
|
||||
... x = 1/0 # <1>
|
||||
... print('END') # <2>
|
||||
...
|
||||
ytpmuD ytpmuH
|
||||
Please DO NOT divide by zero!
|
||||
|
||||
# END MIRROR_GEN_DEMO_3
|
||||
|
||||
>>> with looking_glass():
|
||||
... print('Humpty Dumpty')
|
||||
... x = no_such_name # <1>
|
||||
... print('END') # <2>
|
||||
...
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
NameError: name 'no_such_name' is not defined
|
||||
|
||||
|
||||
|
||||
"""
|
||||
|
||||
|
||||
# BEGIN MIRROR_GEN_EXC
|
||||
|
||||
import contextlib
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def looking_glass():
|
||||
import sys
|
||||
original_write = sys.stdout.write
|
||||
|
||||
def reverse_write(text):
|
||||
original_write(text[::-1])
|
||||
|
||||
sys.stdout.write = reverse_write
|
||||
msg = '' # <1>
|
||||
try:
|
||||
yield 'JABBERWOCKY'
|
||||
except ZeroDivisionError: # <2>
|
||||
msg = 'Please DO NOT divide by zero!'
|
||||
finally:
|
||||
sys.stdout.write = original_write # <3>
|
||||
if msg:
|
||||
print(msg) # <4>
|
||||
|
||||
|
||||
# END MIRROR_GEN_EXC
|
||||
Reference in New Issue
Block a user