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实现ssh批量登录并执行命令
Oct 25 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
Python 从相对路径下import的方法
Dec 04 Python
python实现文本界面网络聊天室
Dec 12 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python requests模块的使用示例
Apr 07 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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 5.5 新特性
2013/07/02 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
python中的字典使用分享
2016/07/31 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
详解python tkinter模块安装过程
2020/01/06 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
企业承诺书格式
2014/05/21 职场文书
大学生应聘求职信
2014/05/26 职场文书
爬山的活动方案
2014/08/16 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
特此通知格式
2015/04/27 职场文书
七一晚会主持词
2015/06/29 职场文书
2016年公司新年寄语
2015/08/17 职场文书
聘任通知书
2015/09/21 职场文书