Используя переменную 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 эмпирического правила для переменной области