Escribir gestores de contexto

Escribir funciones en Python

Shayne Miel

Software Architect @ Duo Security

Dos formas de definir un gestor de contexto

  • Basado en clases
  • Basado en funciones
Escribir funciones en Python

Dos formas de definir un gestor de contexto

  • Basado en clases
  • Basado en funciones *
Escribir funciones en Python

Cómo crear un gestor de contexto


def my_context():

# Add any set up code you need
yield
# Add any teardown code you need
  1. Define una función.
  2. (opcional) Añade el código de preparación que necesites.
  3. Usa la palabra clave "yield".
  4. (opcional) Añade el código de limpieza que necesites.
Escribir funciones en Python

Cómo crear un gestor de contexto

@contextlib.contextmanager
def my_context():

# Add any set up code you need
yield
# Add any teardown code you need
  1. Define una función.
  2. (opcional) Añade el código de preparación que necesites.
  3. Usa la palabra clave "yield".
  4. (opcional) Añade el código de limpieza que necesites.
  5. Añade el decorador `@contextlib.contextmanager`.
Escribir funciones en Python

La palabra clave "yield"

@contextlib.contextmanager
def my_context():
  print('hello')
  yield 42
  print('goodbye')
with my_context() as foo:
  print('foo es {}'.format(foo))
hello
foo is 42
goodbye
Escribir funciones en Python

Preparación y limpieza

@contextlib.contextmanager
def database(url):
  # set up database connection
  db = postgres.connect(url)

  yield db

  # tear down database connection
  db.disconnect()
url = 'http://datacamp.com/data'
with database(url) as my_db:
  course_list = my_db.execute(
    'SELECT * FROM courses'
  )

espacio en blanco

flecha

Escribir funciones en Python

Preparación y limpieza

@contextlib.contextmanager
def database(url):
  # set up database connection
  db = postgres.connect(url)

  yield db

  # tear down database connection
  db.disconnect()
url = 'http://datacamp.com/data'
with database(url) as my_db:
  course_list = my_db.execute(
    'SELECT * FROM courses'
  )

espacio en blanco

espacio en blanco

espacio en blanco

flecha

Escribir funciones en Python

Preparación y limpieza

@contextlib.contextmanager
def database(url):
  # set up database connection
  db = postgres.connect(url)

  yield db

  # tear down database connection
  db.disconnect()
url = 'http://datacamp.com/data'
with database(url) as my_db:
  course_list = my_db.execute(
    'SELECT * FROM courses'
  )

espacio en blanco

espacio en blanco

espacio en blanco

espacio en blanco

espacio en blanco

espacio en blanco

flecha

Escribir funciones en Python

Devolver un valor o None con yield

@contextlib.contextmanager
def database(url):
  # set up database connection
  db = postgres.connect(url)

  yield db

  # tear down database connection
  db.disconnect()
url = 'http://datacamp.com/data'
with database(url) as my_db:
  course_list = my_db.execute(
    'SELECT * FROM courses'
  )
@contextlib.contextmanager
def in_dir(path):
  # save current working directory
  old_dir = os.getcwd()

  # switch to new working directory
  os.chdir(path)

  yield

  # change back to previous
  # working directory
  os.chdir(old_dir)
with in_dir('/data/project_1/'):
  project_files = os.listdir()
Escribir funciones en Python

¡Vamos a practicar!

Escribir funciones en Python

Preparing Video For Download...