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程序与MySQL的教程
Apr 29 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
Python生成随机验证码的两种方法
Dec 22 Python
python3实现全角和半角字符转换的方法示例
Sep 21 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python开启线程,在函数中开线程的实例
Feb 22 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
如何使用flask将模型部署为服务
May 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
星际中的相关伤害
2020/03/04 星际争霸
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
Js基础学习资料
2010/11/23 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
JS求解两数之和算法详解
2020/04/28 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
python编程实现归并排序
2017/04/14 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
详细分析Python collections工具库
2020/07/16 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
个人近期表现材料
2014/02/11 职场文书
防汛工作情况汇报
2014/10/28 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
失恋33天观后感
2015/06/11 职场文书
老乡会致辞
2015/07/28 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python