Python中的pathlib.Path为什么不继承str详解

 更新时间:2019年06月23日 08:57:34   作者:栖迟于一丘  
这篇文章主要给大家介绍了关于Python中pathlib.Path为什么不继承str的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

起步

既然所有路径都可以表示为字符串,为什么 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正则匹配

    一文带你轻松搞定Python正则匹配

    在python 中,正则匹配用到的还是挺多的,下面这篇文章主要给大家介绍了关于Python正则匹配的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Python的爬虫框架scrapy用21行代码写一个爬虫

    Python的爬虫框架scrapy用21行代码写一个爬虫

    最近在学习Python的爬虫框架scrapy,通过爬取线报网站后发现整个过程还是挺值得学习的,所以下面这篇文章主要就给大家介绍了Python的爬虫框架scrapy利用21行代码写一个爬虫的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • 详解python polyscope库的安装和例程

    详解python polyscope库的安装和例程

    这篇文章主要介绍了python polyscope库的安装和例程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • python多线程和多进程关系详解

    python多线程和多进程关系详解

    在本篇文章里小编给大家整理的是一篇关于python多线程和多进程之间的联系的基础内容,有兴趣的朋友们可以学习下。
    2020-12-12
  • Python常见编码和解码技术详解

    Python常见编码和解码技术详解

    这篇文章详细介绍了 Python 常见的编码和解码技术,包括字符编码(如 ASCII、UTF-8 等)、数据编码(如 Base64、URL 编码等)、文件编码,通过代码示例讲解操作方法及错误处理,还给出了常见编码的选择指南,强调掌握这些技术对编写程序很重要,需要的朋友可以参考下
    2025-01-01
  • 教你使用Python画圣诞树做浪漫的程序员

    教你使用Python画圣诞树做浪漫的程序员

    这不是圣诞节快到了,还不用Python绘制个圣诞树和烟花让女朋友开心开心,也算是亲手做的,稍稍花了点心思,学会了赶紧画给你的那个她吧
    2022-12-12
  • python实现接口并发测试脚本

    python实现接口并发测试脚本

    这篇文章主要为大家详细介绍了python实现接口并发测试脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • 解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题

    解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题

    这篇文章主要介绍了解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python实现比较类的两个instance(对象)是否相等的方法分析

    python实现比较类的两个instance(对象)是否相等的方法分析

    这篇文章主要介绍了python实现比较类的两个instance(对象)是否相等的方法,结合实例形式分析了Python判断类的实例是否相等的判断操作实现技巧,需要的朋友可以参考下
    2019-06-06
  • 利用django-suit模板添加自定义的菜单、页面及设置访问权限

    利用django-suit模板添加自定义的菜单、页面及设置访问权限

    这篇文章主要给大家介绍了关于利用django-suit模板添加自定义的菜单、页面及设置访问权限的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2018-07-07

最新评论