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机器学习实战之K均值聚类
Dec 20 Python
python实现Decorator模式实例代码
Feb 09 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python 批量修改/替换数据的实例
Jul 25 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
利用python求积分的实例
Jul 03 Python
python__name__原理及用法详解
Nov 02 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Python bytes string相互转换过程解析
Mar 05 Python
python matplotlib包图像配色方案分享
Mar 14 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
php socket通信简单实现
2016/11/18 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
JS数组的常用10种方法详解
2020/05/08 Javascript
js实现计算器功能
2020/08/10 Javascript
Python中生成器和迭代器的区别详解
2018/02/10 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
python+opencv实现阈值分割
2018/12/26 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
商场消防管理制度
2014/01/12 职场文书
学习十八大报告感言
2014/02/28 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
详细介绍python类及类的用法
2021/05/31 Python
React Fragment介绍与使用详解
2021/11/11 Javascript