447 votes

Lorsque la del est utile en python ?

Je ne vois vraiment aucune raison pourquoi python doit le mot clé (et la plupart des langues semblent ne pas avoir un mot clé similaire). Par exemple, au lieu de supprimer une variable, on pourrait simplement attribuer à elle. Et lors de la suppression d’un dictionnaire, une `` méthode pourrait être ajoutée.

Y a-t-il une raison de garder `` en python, ou est-ce un vestige de jours avant le garbage collection du Python ?

581voto

Winston Ewert Points 17746

Tout d'abord, vous pouvez del d'autres choses en plus des variables locales

del list_item[4]
del dictionary["alpha"]

Tous deux doivent être clairement utile. Deuxièmement, l'utilisation de del sur une variable locale rend l'objectif plus clair. Comparer:

   del foo

pour

   foo = None

Je sais que dans le cas d' del foo que l'intention est de supprimer la variable de portée. Il n'est pas clair qu' foo = None est de le faire. Si quelqu'un juste attribué foo = None I pourrait croire que c'est du code mort. Mais j'ai tout de suite savoir ce que quelqu'un qui a des codes del foo a été d'essayer de faire.

188voto

Greg Hewgill Points 356191

Il y a cette partie de ce qu' del (à partir de la Référence au Langage Python):

Suppression d'un nom supprime la liaison de ce nom à partir du local ou de l'espace de noms global

Attribution d' None d'un nom ne fait pas de supprimer la liaison du nom de l'espace de noms.

(Je suppose qu'il pourrait y avoir un débat quant à savoir si la suppression d'un nom de liaison est en fait utile, mais c'est une autre question.)

20voto

IfLoop Points 59461

Il est un exemple précis de quand vous devez utiliser del (il peut y en avoir d'autres, mais je sais à propos de celui-ci de la main) lorsque vous utilisez sys.exc_info() d'inspecter une exception. Cette fonction renvoie un tuple, le type d'exception a été soulevée, le message, et un traceback.

Les deux premières valeurs sont généralement suffisants pour diagnostiquer une erreur et d'agir sur elle, mais la troisième contient l'intégralité de la pile d'appel entre, d'où l'exception a été soulevée et l'endroit où l'exception est interceptée. En particulier, si vous faites quelque chose comme

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

le traceback, tb se retrouve dans les locaux de la pile d'appel, la création d'une référence circulaire qui ne peut pas être nettoyée. Ainsi, il est important de faire:

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

à casser la circulaire de référence. Dans de nombreux cas où vous souhaitez appeler sys.exc_info(), comme avec de la métaclasse de la magie, le traceback est utile, si vous avez à faire assurez-vous que vous le nettoyer avant de vous pouvez éventuellement quitter le gestionnaire d'exception. Si vous n'avez pas besoin de le traceback, vous devez le supprimer immédiatement, ou tout simplement faire:

exc_type, exc_value = sys.exc_info()[:2]

Pour éviter tout ensemble.

20voto

tdihp Points 550

Juste une autre pensée.

Lors du débogage d’applications http dans cadre comme Django, la pile des appels complet d’inutile et foiré variables précédemment utilisées, surtout quand c’est une très longue liste, pourrait être très douloureuse pour les développeurs. donc, à ce stade, contrôle de l’espace de noms pourrait être utile.

2voto

fuzzy-waffle Points 585

Je pense que l'une des raisons que del a sa propre syntaxe, c'est que le remplaçant par une fonction peut être difficile, dans certains cas, étant donné qu'elle opère sur la liaison ou de la variable et non pas la valeur de référence. Ainsi, si une fonction de la version de del de la création d'un contexte à transmettre. del toto aurait besoin pour devenir globals().remove('foo') ou locaux().remove('foo') qui se salissant et moins lisible. Encore je dis se débarrasser de del serait bon compte tenu de son apparemment rare de l'utiliser. Mais en enlevant les fonctionnalités de la langue/les défauts peuvent être douloureux. Peut-être que python 4 supprimer :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X