Объяснение 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
1156   4  

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 stuff

PEP343 -- 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

    Ничего не найдено.