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的Django框架中用流响应生成CSV文件的教程
May 02 Python
在Python中使用成员运算符的示例
May 13 Python
Python 内置函数complex详解
Oct 23 Python
Python中%r和%s的详解及区别
Mar 16 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
python学生管理系统代码实现
Apr 05 Python
用python打印1~20的整数实例讲解
Jul 01 Python
Python字符串三种格式化输出
Sep 17 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
基于PyTorch中view的用法说明
Mar 03 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面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
Python读写unicode文件的方法
2015/07/10 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python 发送json数据操作实例分析
2019/10/15 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
我为自己代言广告词
2014/03/18 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python