что делает with в python

Для чего предназначен оператор python «with»?

я наткнулся на Python with заявление впервые сегодня. Я использую Python легко в течение нескольких месяцев и даже не знал о его существовании! Учитывая его несколько неясный статус, я подумал, что стоит спросить:

10 ответов

я считаю, что на это уже ответили другие пользователи до меня, поэтому я добавляю его только для полноты: with оператор упрощает обработку исключений путем инкапсуляции общих задач подготовки и очистки в так называемом контекст-менеджеров. Более подробную информацию можно найти в PEP 343. Например, open оператор сам по себе является контекстным менеджером, который позволяет открывать файл, держать его открытым, пока выполняется контекст with оператор, где вы его использовали, и закройте его, как только вы покинете контекст, независимо от того, оставили ли вы его из-за исключения или во время регулярного потока управления. The with таким образом, оператор может использоваться способами, аналогичными RAII pattern в C++: некоторый ресурс приобретается with заявление и освобождается, когда вы покидаете with контексте.

и, наконец, еще пример, который создает временную папку и удаляет его при выходе из контекста:

Я бы предложил две интересные лекции:

1. The with оператор используется для обертывания выполнения блока методами, определенными контекстным менеджером. Это позволяет общие try. except. finally шаблоны использования, которые должны быть инкапсулированы для удобного повторного использования.

2. Вы могли бы сделать что-то вроде:

3. Я не вижу здесь никакого антипаттерна.
Цитата погружение в Python:

попробовать..наконец-то хорошо. С лучше.

4. Я думаю, это связано с привычкой программистов использовать try..catch..finally заявление с других языков.

Питон with оператор является встроенной языковой поддержкой Resource Acquisition Is Initialization идиома, обычно используемая в C++. Он предназначен для безопасного приобретения и освобождения ресурсов операционной системы.

на with оператор создает ресурсы в области/блок. Вы пишете свой код, используя ресурсы внутри блока. Когда блок выходит, ресурсы освобождаются независимо от результата кода в блоке (то есть, выходит ли блок обычно или из-за исключения).

многие ресурсы в библиотеке Python, которые подчиняются протоколу, требуемому with заявление и поэтому может использоваться с ним из-из-коробки. Однако любой может сделать ресурсы, которые могут быть использованы в инструкции with, реализуя хорошо документированный протокол:PEP 0343

используйте его всякий раз, когда вы получаете ресурсы в приложении, которые должны быть явно освобождены, такие как файлы, сетевые подключения, блокировки и как.

примером антипаттерна может быть использование with внутри цикла, когда было бы более эффективным, чтобы иметь with вне цикла

первый способ-Открытие и закрытие файла для каждого row что может вызвать проблемы с производительностью по сравнению со вторым способом с открытием и закрытием файла только один раз.

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

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

Я установил точность по умолчанию на низкое число, а затем использую with чтобы получить более точный ответ на несколько разделов:

Я использую это много с помощью Гипергеометрического теста, который требует деления больших чисел в результате форм-факториалов. Когда вы делаете вычисления геномного масштаба, вы должны быть осторожны с ошибками округления и переполнения.

посмотреть PEP 343-оператор ‘with’, в конце есть примерный раздел.

. новая инструкция «with» для Python язык можно исключить стандартное использование операторов try/finally.

оператор with работает с так называемыми контекстными менеджерами:

идея в том, чтобы упростить обработку исключений, выполнив необходимую очистку после выхода с блока. Некоторые из встроенных модулей python уже работают в качестве контекстных менеджеров.

пункты 1, 2 и 3 достаточно хорошо покрыты:

4: он относительно новый, доступен только в python2.6+ (или python2.5 Использование from __future__ import with_statement )

в python обычно»С» оператор используется для открытия файла, обработки данных, присутствующих в файле, а также для закрытия файла без вызова метода close (). оператор «with» упрощает обработку исключений, предоставляя действия по очистке.

Читайте также:  при какой температуре нужно гнать самогон с сухопарником второй раз

Примечание: нет необходимости закрывать файл, вызывая close () при file-var.close ()

еще один пример для поддержки из коробки, и тот, который может быть немного озадачивает сначала, когда вы привыкли к встроенному пути open() ведет себя, являются connection объекты популярных модулей базы данных, таких как:

когда with-block закончено, либо с исключением, либо без,соединение не закрыто. В случае with-block завершает с исключением, транзакция откатывается, в противном случае транзакция выполняется.

В приведенном выше примере, Вы заметите, что cursor объекты psycopg2 также являются контекстными менеджерами. Из соответствующей документации по поведению:

когда cursor выходит with-block он закрыт, освобождая любой ресурс, в конечном итоге связанный с ним. Состояние транзакции не изменяется.

Источник

Блог питониста

Разбираемся с «with» в питоне (перевод)

Часто ключевое слово with не до конца понятно даже опытным разработчикам.

Как и многие другие вещи в Python, ключевое слово with на самом деле очень просто устроено, это станет очевидно, как только вы поймете какую проблему оно решает. Посмотрите на данный код:

Если это часто ипользуется, то было бы удобно вынести код “set things up” и “tear things down” в библиотечную функцию, чтобы легко ее использовать. Конечно, вы можете сделать что-то вроде:

Но это немного многословно, особенно если вам нужно изменять локальные переменные. Другой подход заключается в использовании генератора, а затем нужно использовать for-in:

Но yield нельзя было использовать внутри try-finally в 2.4 и раньше. И немного странно использовать loop для чего-то, что вы хотите выполнить один раз.

Поэтому, после рассмотрения нескольких вариантов, Гвидо Ван Россум и python-dev команда наконец решили использовать объект вместо генератора, чтобы контролировать поведение данного кода:

Теперь, когда «with» выражение исполняется, Python исполняет выражение, вызывает метод __enter__ с полученным значением (которое называется «context guard»), затем присваивает переменной переданной словом as (в данном случае thing) то, что возвращает метод __enter__. Далее, Python исполняет тело (в данное случае some code), и в любом случае вызывает метод __exit__.

В добавок, __exit__ может подавить исключение, вернуть вместо него True. Например, этот __exit__ заменяет TypeError, но разрешает все другие исключения:

Источник

Тип contextmanager, контекстный менеджер

Оператор with в Python поддерживает концепцию контекста среды выполнения, определенного контекстным менеджером. Типичные области применения контекстных менеджеров включают сохранение и восстановление различных типов глобального состояния, блокировку и разблокировку ресурсов, закрытие открытых файлов и т. д.

Содержание:

Синтаксис оператора контекста with :

Как работает менеджер контекста with :

Если последовательность команд была завершена по любой причине, кроме исключения, то возвращаемое значение из __exit__() игнорируется, и выполнение продолжается.

При наличии нескольких контекстных менеджеров, то они обрабатываются так, как если бы несколько операторов with были вложенными:

Реализация/протокол менеджера контекста.

Протокол контекстных менеджеров реализован с помощью пары методов, которые позволяют определяемым пользователем классам определять контекст среды выполнения, который вводится до выполнения тела инструкции и завершается при завершении инструкции:

contextmanager.__enter__() :

contextmanager.__exit__(exc_type, exc_val, exc_tb) :

Упрощенное создание менеджеров контекста.

Многие контекстные менеджеры, например, файлы и контексты на основе генераторов будут одноразовыми объектами. После вызова метода __exit__() менеджер контекста больше не будет находиться в работоспособном состоянии (например, файл был закрыт или базовый генератор завершил выполнение).

Источник

Оператор with в Python — менеджеры контекста

Оператор Python with очень полезен. Он появился с Python 2.5, и теперь это вездесущая функция, используемая почти каждым приложением.

Самое полезное (фактически единственное!) Он открывает и освобождает ресурсы.

По сути, он обрабатывает открытие и закрытие любых ресурсов, которые могут вам понадобиться для определенной части программы, а затем автоматически закрывает ее.

Зачем нужны контекстные менеджеры в Python?

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

Читайте также:  регион 165 какой город на номерах машины

Оператор with теперь автоматически это делает, поэтому вам не нужно каждый раз закрывать файл вручную. У оператора with есть контекст (блок), в котором он действует. Это как объем заявления.

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

Обратите внимание, насколько это интуитивно понятно. Оператор Python with всегда будет закрывать файл в конце, даже если программа завершилась ненормально даже в контексте или блоке.

Эта функция безопасности рекомендуемый выбор для всех программистов.

Использование

Объект контекста — это объект, который содержит дополнительную информацию о своем состоянии, такую как модуль или область видимости и т. д. Это полезно, поскольку мы можем сохранять или восстанавливать состояние этого объекта.

А теперь идем дальше. После создания объекта контекста он вызывает метод __enter__ dunder для объекта.

Использование as необязательно, особенно если у вас есть ссылка на исходный объект контекста в другом месте.

После этого мы входим во вложенный блок операторов.

После того, как вложенный блок закончился, ИЛИ, если в нем есть исключение, программа всегда выполняет __exit__ для объекта контекста.

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

Наконец, если возможно, __exit__ может быть реализован так, чтобы восстановить состояние объекта контекста, чтобы он вернулся в то состояние, к которому он принадлежал.

Чтобы было понятнее, давайте рассмотрим пример создания нашего собственного диспетчера контекста для класса.

Создание наших собственных менеджеров контекста для нашего класса

Рассмотрим приведенный ниже класс, для которого у нас будет собственный диспетчер контекста для обработки файлов.

Внимательно изучите методы класса. У нас есть метод __init__ для нашего обработчика, который устанавливает начальное состояние объектов контекста и соответствующих переменных.

Теперь метод __enter__ dunder сохраняет состояние объекта и открывает файл. Теперь мы внутри блока.

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

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

Есть два разных метода для менеджера контекста. Эти методы —

Метод __enter __()

Метод __enter __() используется для входа в контекст времени выполнения. Он вернет либо текущий объект, либо другой связанный объект. Возвращаемое значение привязывается к идентификатору в качестве предложения оператора with.

Метод __exit __ (exc_type, exc_val, exc_tb)

Метод __exit __() используется для возврата результата логического типа. Это указывает на любое исключение, которое произошло. Если есть одно исключение для оператора with, оно перейдет в конец блока.

Источник

Основы языка программирования Python за 10 минут

На сайте Poromenos’ Stuff была
опубликована статья, в которой, в сжатой форме,
рассказывают об основах языка Python. Я предлагаю вам перевод этой статьи. Перевод не дословный. Я постарался подробнее объяснить некоторые моменты, которые могут быть непонятны.

Если вы собрались изучать язык Python, но не можете найти подходящего руководства, то эта
статья вам очень пригодится! За короткое время, вы сможете познакомиться с
основами языка Python. Хотя эта статья часто опирается
на то, что вы уже имеете опыт программирования, но, я надеюсь, даже новичкам
этот материал будет полезен. Внимательно прочитайте каждый параграф. В связи с
сжатостью материала, некоторые темы рассмотрены поверхностно, но содержат весь
необходимый метриал.

Основные свойства

Python не требует явного объявления переменных, является регистро-зависим (переменная var не эквивалентна переменной Var или VAR — это три разные переменные) объектно-ориентированным языком.

Синтаксис

Во первых стоит отметить интересную особенность Python. Он не содержит операторных скобок (begin..end в pascal или <..>в Си), вместо этого блоки выделяются отступами: пробелами или табуляцией, а вход в блок из операторов осуществляется двоеточием. Однострочные комментарии начинаются со знака фунта «#», многострочные — начинаются и заканчиваются тремя двойными кавычками «»»»».
Чтобы присвоить значение пременной используется знак «=», а для сравнения —
«==». Для увеличения значения переменной, или добавления к строке используется оператор «+=», а для уменьшения — «-=». Все эти операции могут взаимодействовать с большинством типов, в том числе со строками. Например

Читайте также:  райффайзенбанк чей это банк какой страны

Структуры данных

Вы можете использовать часть массива, задавая первый и последний индекс через двоеточие «:». В таком случае вы получите часть массива, от первого индекса до второго не включительно. Если не указан первый элемент, то отсчет начинается с начала массива, а если не указан последний — то масив считывается до последнего элемента. Отрицательные значения определяют положение элемента с конца. Например:

Строки

Строки в Python обособляются кавычками двойными «»» или одинарными «’». Внутри двойных ковычек могут присутствовать одинарные или наоборот. К примеру строка «Он сказал ‘привет’!» будет выведена на экран как «Он сказал ‘привет’!». Если нужно использовать строку из несколько строчек, то эту строку надо начинать и заканчивать тремя двойными кавычками «»»»». Вы можете подставить в шаблон строки элементы из кортежа или словаря. Знак процента «%» между строкой и кортежем, заменяет в строке символы «%s» на элемент кортежа. Словари позволяют вставлять в строку элемент под заданным индексом. Для этого надо использовать в строке конструкцию «%(индекс)s». В этом случае вместо «%(индекс)s» будет подставлено значение словаря под заданным индексом.

Операторы

Операторы while, if, for составляют операторы перемещения. Здесь нет аналога оператора select, так что придется обходиться if. В операторе for происходит сравнение переменной и списка. Чтобы получить список цифр до числа — используйте функцию range( ). Вот пример использования операторов

if rangelist[ 1 ] == 2 :
print «The second item (lists are 0-based) is 2»
elif rangelist[ 1 ] == 3 :
print «The second item (lists are 0-based) is 3»
else :
print «Dunno»

while rangelist[ 1 ] == 1 :
pass

Функции

# Следующая запись эквивалентна def f(x): return x + 1
functionvar = lambda x: x + 1
>>> print functionvar( 1 )
2

Классы

Язык Python ограничен в множественном наследовании в классах. Внутренние переменные и внутренние методы классов начинаются с двух знаков нижнего подчеркивания «__» (например «__myprivatevar»). Мы можем также присвоить значение переменной класса извне. Пример:

Исключения

Исключения в Python имеют структуру tryexcept [exceptionname]:

def somefunction():
try :
# Деление на ноль вызывает ошибку
10 / 0
except ZeroDivisionError :
# Но программа не «Выполняет недопустимую операцию»
# А обрабатывает блок исключения соответствующий ошибке «ZeroDivisionError»
print «Oops, invalid.»

Импорт

Внешние библиотеки можно подключить процедурой «import [libname]», где [libname] — название подключаемой библиотеки. Вы так же можете использовать команду «from [libname] import [funcname]», чтобы вы могли использовать функцию [funcname] из библиотеки [libname]

import random #Импортируем библиотеку «random»
from time import clock #И заодно функцию «clock» из библиотеки «time»

Работа с файловой системой

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

myfile = file (r «C:\text.txt» )
>>> print myfile.read()
‘This is a sample string’
myfile.close()

Особенности

def myfunc():
# Выводит 5
print number

def anotherfunc():
# Это вызывает исключение, поскольку глобальная апеременная
# не была вызванна из функции. Python в этом случае создает
# одноименную переменную внутри этой функции и доступную
# только для операторов этой функции.
print number
number = 3

def yetanotherfunc():
global number
# И только из этой функции значение переменной изменяется.
number = 3

Эпилог

Разумеется в этой статье не описываются все возможности Python. Я надеюсь что эта статья поможет вам, если вы захотите и в дальнейшем изучать этот язык программирования.

Преимущества Python

Источник

Сказочный портал