RAII en Python - automatique de la destruction au moment de quitter un champ d'application

J'ai essayé de trouver RAII en Python.
L'Allocation des ressources Est d'Initialisation est un modèle en C++ par lequel
un objet est initialisé comme il est créé. Si elle échoue, alors il jette
une exception. De cette façon, le programmeur sait qu'
l'objet ne sera jamais laissé dans un demi-construit de l'état. Python
peuvent le faire beaucoup plus.

Mais RAII travaille également avec les règles de portée de C++
pour assurer la destruction rapide de l'objet. Dès que la variable
pop hors de la pile, il est détruit. Cela peut se produire en Python, mais seulement
si il n'y a aucune externes ou des références circulaires.

Plus important encore, un nom pour un objet existe toujours jusqu'à ce que la fonction qu'il est
en sorties (et parfois plus). Les Variables au niveau du module sera
de rester pour la durée de vie du module.

Je voudrais avoir une erreur si je fais quelque chose comme ceci:

for x in some_list:
    ...

... 100 lines later ...

for i in x:
    # Oops! Forgot to define x first, but... where's my error?
    ...

J'ai pu supprimer manuellement les noms après je l'ai utilisé,
mais qui serait assez moche, et exigent un effort de ma part.

Et j'aimerais qu'il fasse Ce que je veux Dire dans ce cas:

for x in some_list:
    surface = x.getSurface()
    new_points = []
    for x,y,z in surface.points:
        ...     # Do something with the points
        new_points.append( (x,y,z) )
    surface.points = new_points
    x.setSurface(surface)

Python n'certains de portée, mais pas au niveau d'indentation, juste à
le niveau fonctionnel. Il semble stupide d'exiger que je fais une nouvelle fonction
juste à portée des variables afin que je puisse réutiliser un nom.

Python 2.5 est la "avec la" déclaration de
mais cela nécessite que j'ai choisi de mettre en __enter__ et __exit__ fonctions
et semble généralement plus orienté vers le nettoyage de ressources comme des fichiers
mutex et de serrures quel que soit le vecteur de sortie. Il ne permet pas de portée.
Ou ai-je raté quelque chose?

J'ai cherché pour "Python RAII" et "Python portée" et je n'étais pas capable de trouver quelque chose qui
a abordé la question directement et de façon autoritaire.
J'ai regardé sur tous les PEPs. Le concept ne semble pas être traitées
dans Python.

Suis-je une mauvaise personne parce que je veux avoir la portée des variables en Python?
Est-ce tout simplement trop onu-Pythonic?

Je ne suis pas grokking il?

Peut-être que je suis en train de prendre de suite les avantages de la dynamique des aspects de la langue.
Est-il égoïste parfois envie champ d'application forcée?

Je suis paresseux pour vouloir le compilateur/interpréteur
pour attraper ma négligence variable réutilisation des erreurs? Eh bien, oui, bien sûr, je suis paresseux,
mais je suis paresseux dans le mauvais sens?

  • RAII est l'équivalent en Python de with déclaration (en fait, je suis surpris de voir que l'acronyme de ne pas le faire dans la PPE 343 - c'était certainement jeté autour d'un lot dans les discussions). L'élément manquant que vous demandez est anonyme, les règles de portée à partir de C/C++ et non, Python n'a pas de celles (même si vous pouvez trouver le report de la PEP 3150 d'intérêt). C'est complètement indépendant de la RAII question.
  • Merci pour la réponse. Je pensais que PEP 3150 était de répondre à ma question, mais j'ai réalisé qu'il ne dit rien de la suppression de l'espace de noms. C'est purement pour déplacer l'appel de la fonction ci-dessus le code qui obtient des valeurs pour les paramètres de sorte qu'il est plus évident que le code est en train d'accomplir. Ce que je n'aime pas à propos de with est que le nom ne va pas loin, et que je dois passer le code en __exit__ au lieu de __del__. Il est peut-être un habile objet wrapper qui serait del le nom de l'objet et de ne pas exiger que je code un __exit__ fonction? Idéalement, il serait affirmer que l'arbitre était le nombre de 0.
  • même si le refcount > 0, vous pouvez del le nom de l'objet à partir de votre propre champ d'application et de se débarrasser de ce nom - ce qui est totalement distincte de en fait en détruisant l'objet. Par exemple, si un objet a été inséré dans un conteneur, son refcount serait > 0, mais vous pouvez toujours del le nom que vous avez utilisé pour faire référence à l'objet lui-même. Peut-être que c'est une partie de votre confusion - del supprime le nom, pas l'objet sous-jacent. C'est une distinction en Python qu'en C/C++ les gens luttent avec - vous traitez avec des noms et des liaisons de noms, pas les variables/les références qui sont alloc ed et libéré.
InformationsquelleAutor markets | 2011-02-21