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在windows下实现备份程序实例
Jul 04 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
python下载图片实现方法(超简单)
Jul 21 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
Python自定义线程池实现方法分析
Feb 07 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
详解python中eval函数的作用
Oct 22 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
深入浅析python的第三方库pandas
Feb 13 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建立文件夹代码
2015/01/06 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
js Flash插入函数免激活代码
2009/03/31 Javascript
js下用gb2312编码解码实现方法
2009/12/31 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
用js实现放大镜效果
2020/10/28 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
总结Python中逻辑运算符的使用
2015/05/13 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
大型活动策划方案
2014/01/12 职场文书
小学毕业感言150字
2014/02/05 职场文书
文明寄语大全
2014/04/11 职场文书
《开国大典》教学反思
2014/04/19 职场文书
2015年公务员工作总结
2015/04/24 职场文书
党员干部学习心得体会
2016/01/23 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript