Написание контекстных менеджеров

Написание функций на Python

Shayne Miel

Software Architect @ Duo Security

Два способа определить контекстный менеджер

  • На основе класса
  • На основе функции
Написание функций на Python

Два способа определить контекстный менеджер

  • На основе класса
  • На основе функции *
Написание функций на Python

Как создать контекстный менеджер


def my_context():

# Add any set up code you need
yield
# Add any teardown code you need
  1. Определите функцию.
  2. (необязательно) Добавьте код инициализации.
  3. Используйте ключевое слово "yield".
  4. (необязательно) Добавьте код завершения.
Написание функций на Python

Как создать контекстный менеджер

@contextlib.contextmanager
def my_context():

# Add any set up code you need
yield
# Add any teardown code you need
  1. Определите функцию.
  2. (необязательно) Добавьте код инициализации.
  3. Используйте ключевое слово "yield".
  4. (необязательно) Добавьте код завершения.
  5. Добавьте декоратор `@contextlib.contextmanager`.
Написание функций на Python

Ключевое слово "yield"

@contextlib.contextmanager
def my_context():
  print('hello')
  yield 42
  print('goodbye')
with my_context() as foo:
  print('foo is {}'.format(foo))
hello
foo is 42
goodbye
Написание функций на Python

Инициализация и завершение

@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'
  )

blankspace

arrow

Написание функций на Python

Инициализация и завершение

@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'
  )

blankspace

blankspace

blankspace

arrow

Написание функций на Python

Инициализация и завершение

@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'
  )

blankspace

blankspace

blankspace

blankspace

blankspace

blankspace

arrow

Написание функций на Python

Возврат значения или None

@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()
Написание функций на Python

Давайте потренируемся!

Написание функций на Python

Preparing Video For Download...