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 Deque 模块使用详解
Jul 04 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 Python
python实现关键词提取的示例讲解
Apr 28 Python
Django基础知识与基本应用入门教程
Jul 20 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
django celery redis使用具体实践
Apr 08 Python
python添加菜单图文讲解
Jun 04 Python
Python with用法:自动关闭文件进程
Jul 10 Python
python实现飞机大战项目
Mar 11 Python
Python作用域与名字空间原理详解
Mar 21 Python
详解python polyscope库的安装和例程
Nov 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
PHP临时文件的安全性分析
2014/07/04 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
简述php环境搭建与配置
2016/12/05 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
JPype实现在python中调用JAVA的实例
2017/07/19 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
大学生学习2014全国两会心得体会
2014/03/13 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
公司授权委托书范文
2014/08/02 职场文书
门市房租房协议书
2014/12/04 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python