8
votes

Qu'est-ce que Python 3.2 "avec / comme" fait "

J'apprends Python et j'essaie du avec **** comme ****: code> déclaration. Je pense que cela fonctionne beaucoup comme c # 's en utilisant (****) { code>, mais j'ai bien peur que je suive des exemples obsolètes.

Ceci est mon code: P>

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    with pprint.pprint as pprint:
AttributeError: __exit__


1 commentaires

Ce ne sont pas les droïdes que vous recherchez ...


4 Réponses :


3
votes

Vous l'utilisez en vous attendant à une alias d'un nom existant, mais dans Python < Code> avec s'attend à ce qu'un gestionnaire de contexte . pprint.pproprint n'est pas un gestionnaire de contexte.


0 commentaires

13
votes

avec ne fonctionne pas comme ça.

Il est conçu pour nettoyer automatiquement un objet à la fin d'un bloc, par exemple. Au lieu de xxx

, vous pouvez faire xxx

et la fermeture se produit automatiquement.

Voir < Un href = "http://www.python.org/dev/peps/pep-0343/" rel = "NOREFERRER"> PEP 343 - La déclaration "avec" pour plus de détails et Quoi de neuf à Python 2.5 - PEP 343 Pour plus d'autres exemples de la façon dont Vous pouvez l'utiliser.


2 commentaires

Ce n'est pas que avec devrait le nettoyer, c'est que le gestionnaire de contexte devrait se nettoyer et avec gère sa durée de vie de manière appropriée.


Oui, mais pour répondre à une simple question avec des détails sur les gestionnaires de contexte et __ sortie __ serait trop déroutant IMHO.



8
votes

Le avec la relève n'est pas destiné à faire ce que vous attendez. Il utilise le "protocole de contexte gestionnaire" et, en tant que tel, il s'attend à être adopté un Gestionnaire de contexte .

Pour créer un alias, attribuez-le à une nouvelle variable: xxx


3 commentaires

Ou de pprint importation pprint . Ou de pPrint importation pprint comme pp


J'ai supposé que l'alias devait être local dans un bloc, voyant comment l'OP a essayé d'utiliser le avec la relève . Si cela n'est pas nécessaire, le renommage à l'importation est en effet la meilleure solution.


Vous pouvez en savoir plus sur la déclaration "AS" ici: pythontic.com/concepts/keywords/aside/a > Cela devrait faire la différence entre «importer .. comme.» Et «avec .. comme ..» clair.



1
votes

aliasing n'est pas ce que avec code> est pour. Ce que vous voulez probablement, c'est:

from pprint import pprint

pow = 1, 2, 3
pprint(pow)


0 commentaires