【问题标题】:Can PyFilesystem be forced to make filesystems a singleton?可以强制 PyFilesystem 使文件系统成为单例吗?
【发布时间】:2019-03-09 00:13:59
【问题描述】:

我正在使用PyFilesystem。我正在测试的代码使用open_fs(file_url) 创建一个默认文件系统。当我测试这段代码时,我现在可以传入mem://filepath/filename 以使用内存文件系统运行测试。

但是,为了进行测试,我需要使用我的测试文件填充内存文件系统。有没有办法让我在文件系统上强制一个全局单点?我希望当open_fs 在我无法控制的代码中运行时,它会打开我之前创建并使用我的测试文件播种的相同文件系统。

【问题讨论】:

  • 你可以给模块打猴子补丁,所以当内存文件系统打开时,它首先检查是否已经完成,如果是,则返回之前返回的内容,而不是创建另一个实例。见问题What is a monkey patch?。如果你做一些研究,有很多方法可以在 Python 中实现单例。
  • 这是我发现的一篇文章,展示了一种实现 singletons 的方法。该代码在我的浏览器中无法正确显示,但您应该能够弄清楚。这是另一个recipe

标签: python pyfilesystem


【解决方案1】:

PyFilesystem 作者在这里。简短的回答是,在内存文件系统的情况下,一旦关闭 FS 对象,内存就会被丢弃。只有当底层存储机制是持久的时,文件系统才会持久。

稍长一点的答案是您可以使用 TempFS 的子目录来创建持久文件系统。

# Create a temporary filesystem at module scope
temp_fs = open_fs('temp://')

# Acquire new persistent temporary directory
# (this is just a path you can pass to open_fs)
# If you open this multiple times, the data will persist
new_dir = temp_fs.makedir('foo').getsyspath()

# Close temporary filesystem, to delete all directories
temp_fs.close()

这应该给你你描述的语义。

如果您正在使用的项目正在使用 FS url 打开和关闭文件系统,并且仍然希望数据存在,那么它将与不受持久存储支持的文件系统中断。也许您可以向作者建议,只要需要,他们就可以保留 FS 对象,这是我通常推荐的。

【讨论】:

  • 感谢您的回复!就我而言,我可以简单地传入一个文件系统对象。但是,这个问题的动机是它似乎与 PyFilesystem 的“简单”目的背道而驰,尤其是在单元测试中进行模拟时。确保所有使用文件的代码都接受并跟踪文件系统对象,这感觉就像是一堆额外的内务管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2022-08-20
  • 2021-12-26
相关资源
最近更新 更多