Объяснение Python 'enter' и ' exit '
Я видел это в чьем-то коде. Что это значит?
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
from __future__ import with_statement#for python2.5
class a(object):
def __enter__(self):
print 'sss'
return 'sss111'
def __exit__(self ,type, value, traceback):
print 'ok'
return False
with a() as s:
print s
print s
4 ответов:
используя эти магические методы (
__enter__,__exit__) позволяет реализовать объекты, которые могут быть легко использованы сwithзаявление.идея заключается в том, что он позволяет легко создавать код, который должен некоторым 'очистка' код выполняется (считайте это
try-finallyблок). еще одно объяснение здесь.полезным примером может быть объект подключения к базе данных (который затем автоматически закрывает соединение, как только соответствующий оператор " with вне сферы действия):
class DatabaseConnection(object): def __enter__(self): # make a database connection and return it ... return self.dbconn def __exit__(self, exc_type, exc_val, exc_tb): # make sure the dbconnection gets closed self.dbconn.close() ...как объяснено выше, используйте этот объект с
withзаявление (возможно, вам нужно сделатьfrom __future__ import with_statementв верхней части файла, если вы находитесь на Python 2.5).with DatabaseConnection() as mydbconn: # do stuffPEP343 -- The' with 'statement' имеет хорошую запись, а также.
если вы знаете, что контекст-менеджеров тогда вам больше ничего не нужно понимать
__enter__и__exit__магические методы. Давайте рассмотрим очень простой пример.в этом примере я открываю мой_файл.txt С помощью открыть
мне было странно трудно найти документы python для
__enter__и__exit__методы с помощью Google, так что, чтобы помочь другим здесь ссылка:https://docs.python.org/2/reference/datamodel.html#with-statement-context-managers
object.__enter__(self)
Введите контекст выполнения, связанный с этим объектом. Элементwithоператор свяжет возвращаемое значение этого метода с целевыми значениями, указанными в предложении as оператора, если любой.
object.__exit__(self, exc_type, exc_value, traceback)
Закройте контекст выполнения, связанный с этим объектом. Параметры описывают исключение, вызвавшее выход из контекста. Если контекст был выведен без исключения, все три аргумента будутNone.если предоставлено исключение, и метод хочет подавить исключение (т. е. предотвратить его распространение), он должен вернуть истинное значение. В противном случае исключение будет обработано нормально при выходе из этот метод.
отметим, что
__exit__()методы не должны повторно вызывать переданное исключение; это ответственность вызывающего объекта.Я надеялся на четкое описание
__exit__аргументов метода. Это не хватает, но мы можем вывести их...предположительно
exc_type- это класс исключения.он говорит, что вы не должны повторно поднять переданное исключение. Это говорит нам о том, что один из аргументов может быть фактическим Экземпляр исключения ...или, может быть, вы должны создать его самостоятельно из типа и значения?
мы можем ответить, посмотрев на эту статью:
http://effbot.org/zone/python-with-statement.htmследующее__exit__метод проглатывает любой TypeError, но пропускает все другие исключения через:def __exit__(self, type, value, traceback): return isinstance(value, TypeError)...так яснее?
valueявляется экземпляром исключения.и, вероятно,
traceback- питон traceback
в дополнение к приведенным выше ответам, чтобы проиллюстрировать порядок вызова, простой пример выполнения
class myclass: def __init__(self): print("__init__") def __enter__(self): print("__enter__") def __exit__(self, type, value, traceback): print("__exit__") def __del__(self): print("__del__") with myclass(): print("body")производит вывод:
__init__ __enter__ body __exit__ __del__напоминание: при использовании синтаксис
with myclass() as mc, переменная mc получает значение, возвращаемое__enter__()в данном случаеNone! Для такого использования необходимо определить возвращаемое значение, например:def __enter__(self): print('__enter__') return self
Comments