Я нашел такие блоки кода:
with a as b:
c = b.algo()
Это выглядело бы как некоторая динамика, похожая на namespaces
, но следующий код
a = 1
with a as b:
print a, b
возвращает следующую ошибку:
AttributeError: __exit__
Так что же такое ключевое слово для with
, и как оно работает? Какова роль __exit__
?
Предложение
with
не имеет в питоне функции разграничения пространства имен ( «пространств имен» ), как это делается в других языках, таких как VB. Это больше для определения языкового стандарта, который будет иметь блок кода, который известен как «контекст» .« Контекст» в основном устанавливается с начальной настройкой и концом для получения предыдущих значений. Примером может быть открытие файла:
Мы начинаем блок с открытия файла, а в конце файл будет автоматически закрыт, даже если это не было указано явно.
Для управления контекстом используются «менеджеры контекста» ( «context manager» ), представляющие собой объекты, имеющие методы
__enter__
и__exit__
. Первый для инициализации контекста, второй для его завершения.Объекты в python реализуют
files
интерфейс менеджера контекста , поэтому их использование в контекстах гарантирует корректное закрытие файлов.В стандартной библиотеке есть еще много объектов, реализующих интерфейс менеджера контекста. Одним из наиболее значимых является тип
Decimal
, где через контекст можно указать десятичную точность операций, которые будут выполняться внутри блока:Существуют также библиотеки, такие как Fabric , которые используют контексты для настройки соединений серверов, на которых выполняется сценарий.
В вашем случае ошибка, которую вы получаете, заключается в том, что для переменной не
a
определены методы диспетчера контекста .Для получения более подробной информации см. PEP-343 .