Otro gran ejemplo de context managers (sin caer en el razonamiento circular usando “open” para crean un “custom_open”)
es el verlo como una implementacion de tareas de shell, pero en python (imaginate escribiendo el “setup.py” de un server linux)
Han notado como es muy sencillo escribir en shell:
cd /path/to/project
coolShellCommand -xyz
cd -
Pero en python se necesita implementar algo como esto:
cwd = os.getcwd()
try:
os.chdir('path/to/project')
os.system('coolShellCommand -xyz')
finally:
os.chdir(cwd)
Lo cual se ve bastente feo y desordenado, seria genial escribir algo como:
with os.chdir('path/to/project/'):
os.system('coolShellCommand -xyz')
Pero no existe, asi que creemoslo nosotros:
class cdContextMgr(object):
def __init__(self, new_dir):
self.new_dir = new_dir
self.old_dir = None
def __enter__(self):
self.old_dir = os.getcwd()
os.chdir(self.new_dir)
def __exit__(self, *_):
os.chdir(self.old_dir)
y asi podemos utilizar:
with cdContextMgr('/path/to/project')
os.system('coolShellCommand -xyz')
Esto hace lo mismo que al principio, nos evitamos duplicar codigo y aprendemos sobre conext managers
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?