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内置的字符串处理函数整理
Jan 29 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
Python操作Excel插入删除行的方法
Dec 10 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python for循环与range函数的使用详解
Mar 23 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 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
如何正确理解PHP的错误信息
2006/10/09 PHP
php 输出双引号"与单引号'的方法
2010/05/09 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
Django发送html邮件的方法
2015/05/26 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
公司年会主持词
2014/03/22 职场文书
四年级学生期末评语
2014/12/26 职场文书
人事主管岗位职责
2015/02/04 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
销售人员管理制度
2015/08/06 职场文书