Подтвердить что ты не робот

Переменная, определенная с помощью оператора-оператора, доступная вне с-блоком?

Рассмотрим следующий пример:

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, похоже, определяется вне с-блоком, но я предпочел бы не полагаться на детали реализации, которые могут измениться.

4b9b3361

Ответ 1

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

Ответ 2

синтаксис 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()

менеджер контекста может быть полезен более одного раза.

Ответ 3

В случае, если 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.

Ответ 4

Чтобы ответить на вопрос Хейкки в комментариях: да, это видимое поведение является частью спецификации языка python и будет работать на любых совместимых Pythons (включая PyPy, Jython и IronPython).