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回调函数用法实例分析
May 09 Python
浅谈Python的文件类型
May 30 Python
Python全局变量用法实例分析
Jul 19 Python
python常用知识梳理(必看篇)
Mar 23 Python
详细分析python3的reduce函数
Dec 05 Python
Python获取指定字符前面的所有字符方法
May 02 Python
python实现flappy bird小游戏
Dec 24 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
详解Python装饰器
Mar 25 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
python 创建一维的0向量实例
Dec 02 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
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
Python中format()格式输出全解
2019/04/12 Python
实例详解Python模块decimal
2019/06/26 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Python @property使用方法解析
2019/09/17 Python
python实现连连看游戏
2020/02/14 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
美国批发供应商:Kole Imports
2019/04/10 全球购物
园林设计师自荐信
2013/11/18 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
雾霾停课通知
2015/04/24 职场文书
2015年人事科工作总结
2015/04/28 职场文书
辩护词范文大全
2015/05/21 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers