Prenons l'exemple suivant:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
J'ai lu la documentation du langage (2.7) pour with-statement ainsi que pour PEP-343, mais pour autant que je sache, ils ne disent rien à ce sujet.
Dans CPython 2.6.5 f
semble être défini en dehors du bloc with, mais je préfère ne pas me fier à un détail d'implémentation qui pourrait changer.
Réponses:
Oui, le gestionnaire de contexte sera disponible en dehors de l'instruction with et ne dépend pas de l'implémentation ou de la version. avec des instructions ne créent pas de nouvelle portée d'exécution.
la source
la
with
syntaxe:est approximativement du sucre pour:
Ceci est souvent utile. Par exemple
le gestionnaire de contexte peut être utilisé plus d'une fois.
la source
Dans le cas où il
f
s'agit d'un fichier, il apparaîtra fermé en dehors de lawith
déclaration.Par exemple, ce
imprimerait:
Vous pouvez trouver les détails dans PEP-0343 sous la section Spécification: La déclaration «avec» . Les règles de portée Python (qui peuvent être irritantes ) s'appliquent
f
également.la source
[x for x in [1]]
.x
est disponible en dehors de cela. Faites - en un générateur:(x for x in [1])
. Maintenantx
n'est pas disponible. Je semble me souvenir que cela a été changé dans Python 3 afin que même avec la compréhension de la listex
ne fuit pas, mais je ne peux pas trouver la référence maintenant.Pour répondre à la question de Heikki dans les commentaires: oui, ce comportement de cadrage fait partie de la spécification du langage python et fonctionnera sur tous les Pythons compatibles (qui incluent PyPy, Jython et IronPython).
la source