Разница между менеджерами контекста и декораторами в Python - PullRequest
0 голосов
/ 12 июня 2018

В чем главное различие между ними?Я изучал Python и наткнулся на них.Декоратор - это, по сути, функция, которая оборачивает другую функцию, и вы можете делать что угодно до и после выполнения определенной функции.

def my_decorator(some_function):
    def wrapper(*args, **kwargs):
        print("Do something before the function is called")
        some_function(*args, **kwargs)
        print("Do something after the function is called")

    return wrapper

@my_decorator
def addition(a, b):
    result = a+b
    print("Addition of {} and {} is {}".format(a,b,result))

Но после изучения Context Manager я не мог не заметить, что у него тоже есть введите и выход , где вы можете выполнять большинство подобных операций.

from contextlib import contextmanager

@contextmanager
def open_file(path, mode):
    the_file = open(path, mode)
    yield the_file
    the_file.close()

files = []

for x in range(100000):
    with open_file('foo.txt', 'w') as infile:
        files.append(infile)

for f in files:
    if not f.closed:
        print('not closed')

Все до выхода берется как часть "входа" и все после части "выхода".

Хотя и Менеджеры контекста, и Декораторы синтаксически различны, их поведение можно рассматривать как схожее.Так в чем же разница?Каковы различные сценарии, когда следует использовать любой из них?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Они представляют собой совершенно разные понятия и не должны рассматриваться в одном свете.

Декоратор позволяет расширять или заменять функцию или класс, когда он определен .Это гораздо шире, чем просто выполнение чего-либо до или после вызова функции.Конечно, ваш конкретный декоратор позволяет вам что-то делать непосредственно до и после вызова функции, , если исключение не возникает, или вы явно обрабатываете исключения .Но вы также можете использовать декоратор для добавления атрибута к объекту функции или для обновления какого-либо реестра.Или вернуть что-то совершенно другое и игнорировать исходную функцию.Или создать оболочку, которая манипулирует переданными аргументами, или возвращаемое значение исходной функции.Менеджер контекста не может делать ничего из этого.

Менеджер контекста, с другой стороны, позволяет абстрагироваться от try: ... finally: конструкций , в которых независимо от того, как блокВыход , вы получите выполнить еще один код в конце блока.Даже если блок вызывает исключение или использует return для выхода из функции, метод менеджера контекста __exit__ по-прежнему будет вызываться, независимо от .Диспетчер контекста может даже подавлять любые исключения, возникающие в блоке.

В остальном эти два понятия вообще не связаны.Используйте декораторы, когда вам нужно что-то сделать с функциями или классами, когда они определены.Используйте менеджеры контекста, когда хотите очистить или выполнить другие действия после окончания блока.

0 голосов
/ 12 июня 2018

это совершенно разные понятия.

менеджеры контекста - это объекты, которые будут использоваться с ключевым словом python with.Он запускает код при входе в блок и выходе из блока. Декораторы

являются модификациями определения функции или класса.Он запускает код, который заменяет функцию так, как она определена.

@D
def Y(...):
    ...

- это просто еще один способ записи

def Y(...):
    ....
Y = D(Y)
...