起步
既然所有路径都可以表示为字符串,为什么 pathlib.Path 不继承 str "external nofollow" target="_blank" href="https://mail.python.org/pipermail//python-ideas/2016-April/039475.html">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
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 谭嘉仪-EyesOnMe新曲+精选2022【低速原抓WAV+CUE】
- 尚士达《莫回头》[320K/MP3][184.64MB]
- 尚士达《莫回头》[Hi-Res][24bit 48kHz][FLAC/分轨][1.27G]
- 群星《奔赴!万人现场 第3期》[320K/MP3][98.9MB]
- 谭嘉仪《Lonely》【WAV+CUE】
- 群星《红色钢琴浪漫曲》2CD【WAV+CUE】
- 凤飞飞《浮世情怀》HQCD[正版原抓WAV+CUE]
- 群星《奔赴!万人现场 第3期》[FLAC/分轨][537.75MB]
- 群星 《2024好听新歌23》十倍音质 U盘音乐 [WAV分轨][1.6G]
- 群星《妙音纪念珍藏版》蓝光BSCD[WAV+CUE][1G]
- 【发烧试音】蔡克信严讯人间天籁》[原抓WAV+CUE]
- [ABC唱片]山姆泰勒《西电之声·萨克斯风》[低速原抓WAV+CUE]
- 童丽《微风细雨XRCD2》[原抓WAV+CUE]
- 群星 《车乐坊1》DTS魔音[WAV+CUE][1.7G]
- 邓丽君.2024 -《生誕70年ベスト?アルバム 沒後30年》环球日版 [WAV+分轨][993M]