Используя переменную python снаружи с оператором

В скрипте Python я встретил переменную, которая была определена внутри with заявление, но это было использовано за пределами заявления, как file в следующем примере:

with open(fname, 'r') as file:
    pass
print(file.mode)

Интуитивно я бы сказал, что file не должно существовать вне with Заявление и что это работает только случайно. Я не смог найти убедительного утверждения в документации Python о том, должно ли это работать или нет. Является ли этот тип оператора безопасным для использования (также для будущих версий Python), или его следует избегать? Указатель на эту информацию в документации по Python также будет очень полезен.

1 ответ

Решение

Переменная область применяется только на function, module, а также class уровни. Если вы находитесь в одной и той же функции / модуле / классе, все определенные переменные будут доступны в этой функции / модуле / классе, независимо от того, была ли она определена в with, for, ifи т. д. блок.

Например, это:

for x in range(1):
    y = 1
print(y)

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

Однако вы должны быть осторожны, так как переменная, определенная в вашем блоке кода, может фактически не быть определена, если блок никогда не вводится, как в этом случае:

try:
    with open('filedoesnotexist', 'r') as file:
        pass
except:
    pass # just to emphasize point

print(file.mode)

Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    file.mode
NameError: name 'file' is not defined

Хорошее описание LEGB эмпирического правила для переменной области

Другие вопросы по тегам