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.
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).
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
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.")
from IPython import get_ipython;
get_ipython().magic('reset -sf')
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.
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
.
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 id
s 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))
En mode veille IDE, il y a Shell/Restart Shell. Ctrl + F6 le fera.