Створення менеджерів контексту

Написання функцій у 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'
  )

порожній простір

стрілка

Написання функцій у 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'
  )

порожній простір

порожній простір

порожній простір

стрілка

Написання функцій у 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'
  )

порожній простір

порожній простір

порожній простір

порожній простір

порожній простір

порожній простір

стрілка

Написання функцій у 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...