Python中的pathlib.Path为什么不继承str详解


Posted in Python onJune 23, 2019

起步

既然所有路径都可以表示为字符串,为什么 pathlib.Path 不继承 str ? 这个想法的提出在 https://mail.python.org/pipermail//python-ideas/2016-April/039475.html 可以看到,其中,还提出了将 p'/some/path/to/a/file' 返回 path.Path 实例的想法。

路径都是字符串吗?

从面向对象的继承的思想来看,如果 Path 继承自 str ,那么所有的路径都应该是字符串。但所有的路径都是字符串吗?答案是不。在 POSIX 的接口中,允许二进制字符串作为路径。也就是说路径还有二进制路径的形式存在。所以并不是所有路径都是字符串,尽管所有路径确实都能用字符串表示。

文件系统路径协议
基于上述原因,Python 提出了文件系统路径协议的提案 PEP-519 ,该协议提供str 或 bytes 来表示的文件系统路径。这个协议也就诞生了处理路径的 pathlib 模块 PEP-428,该模块遵守了路径协议并将路径视为对象。

协议的实现一般也是通过鸭子协议来满足,这点出发 Path 也没必要继承 str 。

不是字符串的Path使用上有什么影响

在 Python3.5 及以下将不能用 Path 作为open的参数:

import pathlib
p = pathlib.Path('a.txt')
content = open(p, 'r').read() # 换成 open(str(p), 'r') 可以运行

将会报错:

TypeError: invalid file: PosixPath('a.txt')

但这点在 Python3.6 得到的改善: https://docs.python.org/3/whatsnew/3.6.html#pep-519-adding-a-file-system-path-protocol

内置 open() 函数已更新为接受 os.PathLike 对象,os 和 os.path 模块中的所有相关函数以及大多数其他函数和类标准库都使用了文件路径系统协议。

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...   contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

对于低版本的可以使用兼容性更好的:

with p.open('r') as f:
  content = f.read()

如果路径继承str会怎样

或者说如果我自己创建个路径类继承自 str ,这当然可以,也没人组织你,但我想从设计上阐述下这个做法的弊端。

一方面,这个做法会让路径隐式地视为字符串。不满足Python之禅的 显式胜于隐式 的理念。

另一方面也是比较重要的一点,这个做法淡化了 str 和 bytes 的界限,想想Python 2中二进制文本数据和文本数据的隐式兼容性导致了一个令人头疼的问题,将在这里又重新埋下隐患。这是倒退式的做法。

总结

对于路径类为什么不继承字符串,本文从路径的形式,路径协议,以及API设计解释了。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

扩展阅读

  • Python-ideas: Making pathlib paths inherit from str
  • PEP 519 -- Adding a file system path protocol
  • PEP 428 -- The pathlib module -- object-oriented filesystem paths
  • What's New In Python 3.6 pep-519-adding-a-file-system-path-protocol
Python 相关文章推荐
python网络编程示例(客户端与服务端)
Apr 24 Python
Python中for循环控制语句用法实例
Jun 02 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
tensorflow中next_batch的具体使用
Feb 02 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
Python中包的用法及安装
Feb 11 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
python线程里哪种模块比较适合
Aug 02 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 #Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 #Python
树莓派采用socket方式文件传输(python)
Jun 22 #Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 #Python
树莓派使用USB摄像头和motion实现监控
Jun 22 #Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 #Python
python+openCV利用摄像头实现人员活动检测
Jun 22 #Python
You might like
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
javascript实现密码验证
2015/11/10 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
python实现微信自动回复机器人功能
2019/07/11 Python
django基于restframework的CBV封装详解
2019/08/08 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL