Python中的pathlib.Path為什么不繼承str詳解

 更新時間:2019年06月23日 08:57:35   作者:棲遲于一丘   我要評論
這篇文章主要給大家介紹了關于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設計解釋了。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

擴展閱讀

相關文章

  • Python3 replace()函數使用方法

    Python3 replace()函數使用方法

    這篇文章主要介紹了Python3 replace()函數使用方法,需要的朋友可以參考下
    2018-03-03
  • 基于python 微信小程序之獲取已存在模板消息列表

    基于python 微信小程序之獲取已存在模板消息列表

    這篇文章主要介紹了基于python 微信小程序之獲取已存在模板消息列表的相關知識,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 對python中使用requests模塊參數編碼的不同處理方法

    對python中使用requests模塊參數編碼的不同處理方法

    今天小編就為大家分享一篇對python中使用requests模塊參數編碼的不同處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python中字符串的處理技巧分享

    Python中字符串的處理技巧分享

    這篇文章給大家分享了Python中字符串的處理技巧,包括拆分含有多種分隔符的字符串、判斷字符串a是否以字符串b開頭或結尾、調整字符串中文本的格式已經將多個小字符串拼接成一個大的字符串等,感興趣的朋友們可以通過閱讀下文來學習。
    2016-09-09
  • python快排算法詳解

    python快排算法詳解

    在本篇內容里小編給大家整理了關于python快排算法的相關知識點內基礎內容,需要的朋友們學習下。
    2019-03-03
  • Python玩轉PDF的各種騷操作

    Python玩轉PDF的各種騷操作

    Portable Document Format(可移植文檔格式),或者PDF是一種文件格式,可以用于跨操作系統的呈現和文檔交換。這篇文章主要介紹了Python玩轉PDF的各種騷操作,需要的朋友可以參考下
    2019-05-05
  • 從多個tfrecord文件中無限讀取文件的例子

    從多個tfrecord文件中無限讀取文件的例子

    今天小編就為大家分享一篇從多個tfrecord文件中無限讀取文件的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python optparse模塊使用實例

    python optparse模塊使用實例

    這篇文章主要介紹了python optparse模塊使用實例,optparse是專門來處理命令行選項的,本文就講解了它的使用方法,需要的朋友可以參考下
    2015-04-04
  • Python中線程編程之threading模塊的使用詳解

    Python中線程編程之threading模塊的使用詳解

    這篇文章主要介紹了Python中線程編程之threading模塊的使用詳解,由于GIL的存在,線程一直是Python編程中的焦點問題,需要的朋友可以參考下
    2015-06-06
  • Python面向對象之繼承和多態用法分析

    Python面向對象之繼承和多態用法分析

    這篇文章主要介紹了Python面向對象之繼承和多態用法,結合實例形式分析了Python面向對象程序設計中繼承與多態的原理及相關操作技巧,需要的朋友可以參考下
    2019-06-06

最新評論

湖北11选5走势图爱彩乐 幸运28在哪个网站玩好 新疆11选5一天多少期 000039股票分析 福彩双色球中六个红球 四川快乐十二开结果 湖北快三形态走势图 2019王中王单双必中特 湖北快三开奖结果彩乐 天津快乐十分开奖 云南山水麻将官方网 涵乔配资 东北填大坑手机游戏下载 澳洲幸运5计划软件手机版下载 pk10赛车微信信 十一选五胆码拖码什么意思 河南麻将游戏下载