Skip to main content
 首页 » 编程设计

python之临时货架

2025年05月04日17unruledboy

我正在设计一个具有撤消/重做功能并且必须临时存储大量数据的类。我目前正在通过重载 del 运算符来实现一个“临时”文件,以便在类被垃圾回收时删除文件,但我必须相信有更好的方法可以做到这一点。我试过使用 tempfile 模块,但它不起作用,因为搁置模块需要一个名称,而不是文件对象 (grr)。

无论如何,想知道是否有人有更好的方法来做到这一点。代码的重要部分如下。

import os, shelve 
from time import time 
class DataHandlerUser(DataHandler): 
   def __init__(self, data): 
      # storing items 
      self.__unredofilename = os.path.dirname(__file__) + '/.undoredo' + str(time()) + '.pyworkbooks' 
      try: 
         os.remove(self.__unredofilename) 
      except OSError: pass 
 
      self._undoredoBuffer = shelve.open(self.__unredofilename) 
      # ... rest of init 
 
 
   def __del__(self): 
      # simple check to make sure not tampered with 
      if '.undoredo' not in self.__unredofilename or '.pyworkbooks' not in self.__unredofilename: 
         raise Exception('Critical Error: Internal filename for undo/redo operations tampered with') 
      try: 
         os.remove(self.__unredofilename) 
      except OSError: pass 

请您参考如下方法:

根据代码的运行方式,您仍然会遇到竞争条件,即两个不同的进程获得相同的时间戳和相同的文件名,这种情况可能很少见。添加当前进程 ID 有助于缓解这种情况,但我建议您坚持使用 tempfile 模块。

如果您只需要临时文件的名称,可以使用tempfile.mkstemp 并在使用文件名之前关闭返回的文件描述符:

import os, tempfile 
fd, self._undo_fname = tempfile.mkstemp(suffix='.undoredo', dir='/tmp') 
os.close(fd) 
self._undo_buffer = shelve.open(self._undo_fname)