Estou procurando algo semelhante a 'limpar' no Matlab: um comando / função que remove todas as variáveis da área de trabalho, liberando-as da memória do sistema. Existe tal coisa em Python?
EDIT: Eu quero escrever um script que em algum momento apaga todas as variáveis.
del
los quando terminar. Se você está simplesmente preocupado com o namespace sendo desordenado, você provavelmente deve reconsiderar seu design usando tantos nomes. Por exemplo, para uma série de transformações de imagem, manter cada etapa intermediária provavelmente é desnecessário.Respostas:
A seguinte sequência de comandos remove todos os nomes do módulo atual:
>>> import sys >>> sys.modules[__name__].__dict__.clear()
Duvido que você realmente queira fazer isso, porque "todo nome" inclui todos os embutidos, então não há muito que você possa fazer após uma eliminação total. Lembre-se, em Python não existe realmente algo como uma "variável" - existem objetos , de muitos tipos (incluindo módulos, funções, classes, números, strings, ...), e existem nomes , vinculados a objetos; o que a sequência faz é remover todos os nomes de um módulo (os objetos correspondentes desaparecem se e somente se todas as referências a eles tiverem acabado de ser removidas).
Talvez você queira ser mais seletivo, mas é difícil adivinhar exatamente o que você quer dizer, a menos que queira ser mais específico. Mas, só para dar um exemplo:
>>> import sys >>> this = sys.modules[__name__] >>> for n in dir(): ... if n[0]!='_': delattr(this, n) ... >>>
Essa sequência deixa de lado os nomes que são privados ou mágicos, incluindo o
__builtins__
nome especial que abriga todos os nomes embutidos. Portanto, os integrados ainda funcionam - por exemplo:>>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'n'] >>>
Como você pode ver, name
n
(a variável de controlefor
nele) também permanece (já que é religado nafor
cláusula toda vez), então pode ser melhor nomear essa variável de controle_
, por exemplo, para mostrar claramente "é especial "(mais, no interpretador interativo, o nome_
é reconectado de qualquer maneira após cada expressão completa inserida no prompt, ao valor daquela expressão, de modo que não permanecerá por muito tempo ;-).De qualquer forma, uma vez que você tenha determinado exatamente o que é que você quer fazer, não é difícil de definir uma função para o efeito e colocá-lo em seu arquivo de start-up (se quiser apenas em sessões interativas) ou arquivo local-personalize ( se você quiser em cada script).
fonte
int = (2).__class__
,str = ''.__class__
,True = (1 == 1)
etc ...for n in dir(): ... if n[0]!='_': delattr(this, n)
em algum momenton=this
e deleta do loop! Portanto, na próxima iteração você obterá Erro ao tentardelattr(this,n)
porque acabou de excluí-lo! :) Então não funciona corretamenteNão, é melhor reiniciar o intérprete
IPython é um excelente substituto para o interpretador empacotado e tem o
%reset
comando que geralmente funcionafonte
ctrl-d
entãopyt
->tab
voltar ao intérprete. Não há razão para fazer nada extravagante aqui.%reset -f
para ser não interativo. stackoverflow.com/questions/38798181/…Se você escrever uma função, depois de deixá-la, todos os nomes dentro dela desaparecem.
O conceito é chamado de namespace e é tão bom que chegou ao Zen do Python :
O namespace do IPython também pode ser redefinido com o comando mágico
%reset -f
. (O-f
significa "forçar"; em outras palavras, "não me pergunte se eu realmente quero deletar todas as variáveis, apenas faça".fonte
from IPython import get_ipython; get_ipython().magic('reset -sf')
fonte
%reset -sf
Esta é uma versão modificada da resposta de Alex. Podemos salvar o estado do namespace de um módulo e restaurá-lo usando os 2 métodos a seguir ...
__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
Você também pode adicionar uma linha "clear = restoreContext" antes de chamar saveContext () e clear () funcionará como o clear do matlab.
fonte
names = list(sys.modules[__name__].__dict__.keys())
, caso contrário, o Python reclamará que você alterou o tamanho do dicionário enquanto iterava por meio de seudict_keys
objeto.import
esta resposta (ou seja, salvei isso e importei de um bloco de anotações Jupyter para limpar o espaço de nomes entre os diferentes problemas em uma tarefa de casa), acho que você vai querer usar em"__main__"
vez de__name__
.No Spyder, pode-se configurar o console IPython para cada arquivo Python para limpar todas as variáveis antes de cada execução no Menu
Run -> Configuration -> General settings -> Remove all variables before execution
.fonte
A
globals()
função retorna um dicionário, onde as chaves são nomes de objetos que você pode nomear (e os valores, a propósito, sãoid
s desses objetos). Aexec()
função pega uma string e a executa como se você apenas a digitasse em um console Python. Então, o código éfor i in list(globals().keys()): if(i[0] != '_'): exec('del {}'.format(i))
fonte
No IDE ocioso, há Shell / Reiniciar Shell. Cntrl-F6 fará isso.
fonte
Não é a maneira mais fácil de criar uma classe contendo todas as variáveis necessárias? Então você tem um objeto com todas as variáveis atuais e, se precisar, pode sobrescrever essa variável?
fonte