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 命令行非阻塞输入的小例子
Sep 27 Python
python中assert用法实例分析
Apr 30 Python
浅谈flask中的before_request与after_request
Jan 20 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
python3 实现口罩抽签的功能
Mar 11 Python
django修改models重建数据库的操作
Mar 31 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
python3实现简单飞机大战
Nov 29 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查找指定目录下指定大小文件的方法
2014/11/28 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
Python内置的字符串处理函数整理
2013/01/29 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
Django中Middleware中的函数详解
2019/07/18 Python
python实现拼接图片
2020/03/23 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
Python with语句用法原理详解
2020/07/03 Python
地理教师岗位职责
2014/03/16 职场文书
幼儿园开学寄语
2014/04/03 职场文书
公司委托书范本5篇
2014/09/20 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
企业整改报告范文
2014/11/08 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python