Existe uma maneira fácil de usar um tempfile python em uma prateleira (e certifique-se que limpa-se para cima)?
-
18-09-2019 - |
Pergunta
Basicamente, eu quero um tamanho infinito (mais precisamente, do disco rígido em vez de memória ligados) dict em um programa python que estou escrevendo. Parece que o tempfile e módulos Shelve são naturalmente adequadas para isso, no entanto, eu não posso ver como usá-los juntos em uma maneira segura. Eu quero o tempfile a ser eliminado quando a prateleira é GCed (ou pelo apagamento garantia após a prateleira está fora de uso, independentemente de quando), mas a única solução que eu posso vir acima com para este envolve o uso de tempfile.TemporaryFile () para abrir um identificador de arquivo, recebendo o nome do arquivo a partir da alça, usando este nome de arquivo para abrir uma prateleira, mantendo a referência para o identificador de arquivo para evitar que ele fique GCed (e o arquivo excluído), e em seguida, colocar um invólucro na prateleira que armazena esse referência. Alguém tem uma solução melhor do que essa bagunça convoluta?
Restrições:. Só pode usar a biblioteca python padrão e deve ser plataforma totalmente cruz
Solução
Eu preferia herdar de shelve.Shelf, e substituir o método close (*) para desvincular os arquivos. Note que, dependendo do módulo dbm específico que está sendo usado, você pode ter mais de um arquivo que contém a prateleira. Uma solução poderia ser a criação de um diretório temporário, em vez de um arquivo temporário, e remover qualquer coisa no diretório quando terminar. A outra solução seria se ligam a um módulo específico dbm (digamos, bsddb, ou dumbdbm), e especificamente remover os arquivos que essas bibliotecas criar.
(*) aviso de que o método close de uma prateleira também é chamado quando a prateleira é lixo coletado. O único caso como você pode acabar com arquivos de lixo é quando o intérprete trava ou é morto.