PyFilesystem 2.0 发布了

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

原文地址:https://www.willmcgugan.com/blog/tech/post/announcing-pyfilesystem-2/


我想宣布PyFilesystem 2.0.0 已经可以在PyPi上下载了。


在2008年,我开始编写PyFilesystem模块,自那时起它就成了我个人“标准库”的重要组成部分。很多开发者和组织包括我自己在内都会把这个模块应用于很多项目中。

概述

如果你不熟悉PyFilesystem,没关系。它是文件系统的抽象层。实际上,任何包含文件和目录的东西(硬盘,压缩文件,FTP服务器等等)都可以封装成一个共同的接口。使用这个模块,你可以不需要知道文件确切的物理位置。

下面是一个递归统计文件夹中代码行数的例子:

Image 11-12-2016, 1-25 PM.png

count_python_loc 函数中的参数 fs 是一个FS对象,它包含了你需要对文件系统进行的全部操作。由于这样的高度抽象,同一段代码可以用于任何一个文件系统。例如,你需要对一个zip文件中的代码行数进行统计时,只需要修改一行代码:

projects_fs = open_fs('zip://projects.zip')

如果你想了解更多PyFilesystem的背景知识,请看我以前关于PyFilesystem 的文章(https://www.willmcgugan.com/tag/fs/)

Image 11-12-2016, 1-26 PM.jpeg

tree函数可以将文件系统的结构用unicode字符描绘出来,这是在命令行工具中查看文件变更和调试的绝佳方法。

我的桌面上有树纯属巧合。

为什么需要升级?

2008年以来世界发生了很多变化,Python3出现了,IO库发生了变化,以及scandir函数的出现。在PyFilesystem追随这些变化的过程中,代码被大量的微小改变所困扰。其实问题或许并没有严重到必须重写代码的的地步。但是一个新的版本使我能够对程序的接口进行一些优化,这些优化是无法在不重写代码的情况下进行的。

我们这次重构基于八年以来的观察,我们考虑了开发者们的需求,原有版本的优缺点,以及在消除文件系统间差异的过程中浮现出的无数特殊情况(不同文件系统间的差异真的很明显)。新的API设计变得更加困难,是因为我们希望在不牺牲功能的情况下,让模块的使用尽量简单。这通常需要将很长的函数,分解为数个能够完美实现单一功能的小函数。

另外一个构建新版本的动机,是让实现新的文件系统变得更加容易。最终你只需要完成七个函数就可以实现任何的文件系统。这是一个惊人的成就。总的来讲,新的API让人们开发自己的文件系统变得更加容易,因为大部分繁重的工作已经在基类中完成了。我希望这个模块能够激发更多的开发者开发新的文件系统,同时原有的文件系统也可以尽快迁移到新的版本(我十分乐于配合这些工作)。

那么新的版本究竟有什么改进呢?

更干净的代码

新的项目是一个统一的Python 2 和 3 的代码库,而且完全没有遗留下来的无效代码。我希望这个模块是”防弹的“,因为PyFilesystem是Moya的一个重要组成部分,Moya的静态服务器使用PyFilesystem维护资源。下面是它工作时的截屏:

Image 11-12-2016, 1-26 PM-1.jpeg

Moya使用PyFilesystem作为其静态内容服务器。这张截屏展示了启动静态FTPFS服务时的情形。

复制粘贴变得更容易

下面是将你的项目文件夹压缩成zip文件的代码:

Image 11-12-2016, 1-27 PM.png

这段代码能够工作是因为fs.copy 和 fs.move模块能够接受FS对象和FS URL。

简单的文件信息

文件信息被归类于几个名称空间之下,所以你可以只获取你需要的信息(避免多余的系统请求),下面有一个例子:

Image 11-12-2016, 1-28 PM.png

目录扫描功能更加强大

很不幸,原来的PyFilesystem有一个缺陷,你无法在一次目录扫描的请求中获知哪些路径是文件,哪些是目录。原来的替代方法是第一次只检索目录,然后然后再次检索,只检索文件。分两次检索同一个目录,在网络文件系统中会极大地降低效率。另一种解决办法是使用静态信息,但是这种办法只适用于操作系统的文件系统。

在2.0版本中,目录列表函数会返回一个带有is_dir标记的info对象。因此就不再需要寻找替代的办法了。同时page属性可以让你为大型文件夹标记上页数(当你在处理数百万文件时非常有用)。

目录遍历的接口更加简洁

首先要夸一下这个支持通配符过滤的目录遍历类。能够使用外部对象进行目录遍历让系统更灵活。比如copy_fs函数就可以接受额外的walker参数,通过walker参数我们可以更具体的设置需要拷贝哪个文件。

下面一段代码展示了如何使用Walker对象实现只压缩 .py文件,同时忽略Git目录:

Image 11-12-2016, 1-28 PM-1.png

更靠近底层

每个文件系统的设计都大不相同,zip文件的设计与你的硬盘不相同,与云端的文件系统也不一致,因此设计一个共同的API是一件极富挑战的事情。原有的PyFilesystem API已经支持了一部分相同的特征,但是对或多或少有些区别的地方并不支持(例如权限)。新的版本使用了不同的设计哲学,我们会尽量寻找更多的共同点。

可序列化的API

新的API设计的很容易序列化,它能够很容易与JSONRPC,XML,REST等一同应用于网络文件系统中。

开始我认为这个功能很花哨,但是事实证明这正是开发者们经常需要使用到的功能。新的API应该让这个功能更容易实现。

你是否应该升级?

在原有的PyFilesystem模块中已经包含了相当多的功能,例如通过HTTP和其他网络协议、操作系统的集成工具(FUSE或DOKEN)和命令行工具等传输文件系统。这些都是非常好的工具,但是都需要事先安装数量庞大的依赖库。新的版本更为精简,只需要少数纯python依赖库。其余的附加功能会以单独名称空间的程序包的形式出现。

如果你需要这些附加的功能,你需要在一段时间内继续使用原有版本,直到我把所有功能都迁移到新的版本。同样,如果你需要使用亚马逊S3服务,或者其它第三方工具,也需要稍等一段时间。

其他情况下,我认为你适合升级fs 2.0.0,并会对其非常满意。

如何安装

你可以通过下面的pip命令安装:

pip install fs

如果你是从以前的版本升级,你可以添加-U命令。

或者,你也可以从GitHub上获得PyFilesystem2(https://github.com/PyFilesystem/pyfilesystem2)。

反馈

现在不是提出新功能的最佳时机,欢迎评论。

英文原文:https://www.willmcgugan.com/blog/tech/post/announcing-pyfilesystem-2/
译者:panlining
 

2月15日11:00到13:00网站停机维护,13:00前恢复