首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临时货架?

临时货架?
EN

Stack Overflow用户
提问于 2011-04-04 23:25:46
回答 2查看 960关注 0票数 1

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

不管怎么说,我想知道是否有人有更好的方法来做这个。代码的重要部分如下。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-04 23:49:41

根据代码的运行方式,您仍然可能遇到两个不同进程获得相同时间戳和相同文件名的争用条件,尽管这种情况很少见。添加当前进程id将有助于减轻这一问题,但我建议您继续使用tempfile模块。

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

代码语言:javascript
复制
import os, tempfile
fd, self._undo_fname = tempfile.mkstemp(suffix='.undoredo', dir='/tmp')
os.close(fd)
self._undo_buffer = shelve.open(self._undo_fname)
票数 4
EN

Stack Overflow用户

发布于 2011-04-04 23:58:18

搁置使用anydbm来检测文件中使用的数据库的类型。

您可以使用mkstemp()创建一个tempfile,并将一个空的bsddb (或您喜欢的任何东西)放在其中,然后将该文件名传递给搁置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5545473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档