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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
在Python的Django框架中simple-todo工具的简单使用
May 30 Python
python实用代码片段收集贴
Jun 03 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 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更快的提供文件下载的代码
2012/06/13 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
用Python实现随机森林算法的示例
2017/08/24 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
python怎么判断素数
2020/07/01 Python
2014年感恩母亲演讲稿
2014/05/27 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
毕业实习计划书
2015/01/16 职场文书
2015年组织部工作总结
2015/04/03 职场文书
担保贷款承诺书
2015/04/30 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
医院消毒隔离制度
2015/08/05 职场文书
清明节随笔
2015/08/15 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python