Ответ 1
Да, менеджер контекста будет доступен за пределами оператора with и не зависит от реализации или версии. с операторами не создают новую область выполнения.
Рассмотрим следующий пример:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
Я прочитал языковые документы (2.7) для for-statement, а также PEP-343, но насколько я могу судить, они ничего не говорят по этому поводу.
В CPython 2.6.5 f
, похоже, определяется вне с-блоком, но я предпочел бы не полагаться на детали реализации, которые могут измениться.
Да, менеджер контекста будет доступен за пределами оператора with и не зависит от реализации или версии. с операторами не создают новую область выполнения.
синтаксис with
:
with foo as bar:
baz()
- приблизительно сахар для:
try:
bar = foo.__enter__()
baz()
finally:
if foo.__exit__(*sys.exc_info()) and sys.exc_info():
raise:
Это часто полезно: например
import threading
with threading.Lock() as myLock:
frob()
with myLock:
frob_some_more()
менеджер контекста может быть полезен более одного раза.
В случае, если f
является файлом, он будет закрыт вне инструкции with
.
Например, этот
f = 42
print f
with open('6432134.py') as f:
print f
print f
будет печатать:
42
<open file '6432134.py', mode 'r' at 0x10050fb70>
<closed file '6432134.py', mode 'r' at 0x10050fb70>
Подробности можно найти в PEP-0343 в разделе "Спецификация: инструкция" с ". Правила области Python (который может быть раздражает) применяются к f
.
Чтобы ответить на вопрос Хейкки в комментариях: да, это видимое поведение является частью спецификации языка python и будет работать на любых совместимых Pythons (включая PyPy, Jython и IronPython).