web-dev-qa-db-fra.com

Comment effacer toutes les variables au milieu d'un script Python?

Je cherche quelque chose de similaire à 'clear' dans Matlab: une commande/fonction qui supprime toutes les variables de l'espace de travail et les libère de la mémoire système. Y at-il une telle chose en Python?

EDIT: Je veux écrire un script qui à un moment donné efface toutes les variables.

59
snakile

La séquence de commandes suivante supprime every name du module actuel:

>>> import sys
>>> sys.modules[__name__].__dict__.clear()

Je doute que vous souhaitiez réellement faire cela, parce que "chaque nom" inclut tous les éléments intégrés. Vous ne pouvez donc rien faire de mieux après un tel effacement total. Rappelez-vous que, dans Python, il n’existe pas vraiment de "variable" - il existe des objets , de nombreux types (y compris modules, fonctions, classes, nombres, chaînes, ...), et il y a noms , liés à des objets; la séquence supprime tous les noms d'un module (les objets correspondants disparaissent si et seulement si chaque référence à ceux-ci vient d'être supprimée).

Vous voulez peut-être être plus sélectif, mais il est difficile de deviner exactement ce que vous voulez dire, à moins de vouloir être plus précis. Mais, juste pour donner un exemple:

>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
...   if n[0]!='_': delattr(this, n)
... 
>>>

Cette séquence laisse seuls les noms privés ou magiques, y compris le nom spécial __builtins__ contenant tous les noms intégrés. Donc, les fonctions intégrées fonctionnent toujours - par exemple:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 

Comme vous le voyez, nommez n (la variable de contrôle dans cette for) reste également collée (comme elle est reliée dans la clause for à chaque fois), il est préférable de nommer cette variable de contrôle _, par exemple, pour indiquer clairement "c’est spécial" (plus, dans l’interpréteur interactif, le nom _ est de toute façon lié à chaque expression complète saisie à l’invite, à la valeur de cette expression, afin qu'elle ne reste pas longtemps ;-).

Quoi qu’il en soit, une fois que vous avez déterminé exactement ce que vous voulez faire , il n’est pas difficile de définir une fonction à cette fin et de la mettre à votre début. fichier up (si vous le voulez uniquement dans des sessions interactives) ou fichier de personnalisation de site (si vous le souhaitez dans tous les scripts).

50
Alex Martelli

Non, vous feriez mieux de redémarrer l'interprète

Ipython est un excellent remplaçant pour l'interprète fourni et possède la commande %reset qui fonctionne habituellement

44
John La Rooy

Si vous écrivez une fonction, une fois que vous la laissez, tous les noms à l'intérieur disparaissent.

Le concept s'appelle namespace et c'est tellement bon qu'il en a fait le Zen of Python :

Les espaces de noms sont une excellente idée qui klaxonne - Faisons-en plus!

L'espace de nommage d'IPython peut également être réinitialisé avec la commande magique %reset -f. (Le -f signifie "force"; en d'autres termes, "ne me demandez pas si je veux vraiment supprimer toutes les variables, faites-le.")

26
Jochen Ritzel
from IPython import get_ipython;   
get_ipython().magic('reset -sf')
4
Anurag Gupta

Ceci est une version modifiée de la réponse d'Alex . Nous pouvons enregistrer l'état de l'espace de noms d'un module et le restaurer en utilisant les 2 méthodes suivantes ...

__saved_context__ = {}

def saveContext():
    import sys
    __saved_context__.update(sys.modules[__name__].__dict__)

def restoreContext():
    import sys
    names = sys.modules[__name__].__dict__.keys()
    for n in names:
        if n not in __saved_context__:
            del sys.modules[__name__].__dict__[n]

saveContext()

hello = 'hi there'
print hello             # prints "hi there" on stdout

restoreContext()

print hello             # throws an exception

Vous pouvez également ajouter une ligne "clear = restoreContext" avant d'appeler saveContext () et clear () fonctionnera comme un effacement de matlab.

3
Jug

Dans Spyder, vous pouvez configurer la console IPython pour chaque fichier Python afin d’effacer toutes les variables avant chaque exécution dans le Menu Run -> Configuration -> General settings -> Remove all variables before execution.

2
tardis

La fonction globals() renvoie un dictionnaire, dans lequel les clés sont des noms d'objets que vous pouvez nommer (et les valeurs sont, par ailleurs, des ids de ces objets). La fonction exec() prend une chaîne et l'exécute comme si vous veniez de la saisir dans une console python. , le code est

for i in list(globals().keys()):
    exec('del {}'.format(i)) if i[0] != '_' else None

Ici, else None est ajouté pour suivre la syntaxe python. Ce code n'a pas l'air beau, mais c'est court. La meilleure façon de l'écrire est

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))
0
Kolay.Ne

En mode veille IDE, il y a Shell/Restart Shell. Ctrl + F6 le fera.

0
Harold Henson