經(jīng)過了幾十年的發(fā)展,Python 的輪子生態(tài)越來越豐富,例如針對網(wǎng)絡(luò)請求有 requests,針對命令行開發(fā)有 typer 等等,這些第三方庫給我們的日常開發(fā)帶來了極大的便利。
今天給兄弟們推薦另一個第三方庫 -- Boltons
,和大多數(shù)第三方庫不太一樣,它并不是針對某一功能的工具庫,而是將開發(fā)中那些重復性(經(jīng)常使用)及復雜度較高(不容易編寫)較高的代碼剝離出來,并按照操作對象分門別類整合在一起的工具庫。
Boltons 使用的是 BSD 許可證,到目前為止已經(jīng)收錄 超過230個 的純 Python實用工具庫,這些工具庫與 Python 標準庫并沒有重合,是補充的關(guān)系,包括:
- cacheutils 工具集:用于管理緩存,提供 LRU 和 LRI 等緩存方式
- debugutils 工具庫:用于調(diào)試實用程序
- dictutils 工具庫:映射類型(OMD)
- ecoutils 工具庫:生態(tài)系統(tǒng)分析
- fileutils工具庫:文件系統(tǒng)幫助器,提供原子文件保存等功能
- formatutils 工具庫:str.format() 工具箱
- funcutils 工具庫:functools 修正
- gcutils 工具庫:垃圾收集工具
- ioutils 工具庫:增強輸入/輸出功能
- iterutils 工具庫:itertools 改進
- jsonutils 工具庫:JSON交互
- listutils 工具庫:list 衍生物
- mathutils 工具庫:提供數(shù)學函數(shù)的支持
- mboxutils 工具庫:Unix郵箱實用程序
- namedutils 工具庫:提供兩種輕量級容器類型
- pathutils 工具庫:提供處理文件路徑的函數(shù)
- queueutils 工具庫:優(yōu)先級隊列,目前提供基于堆及基于排序列表兩種隊列實現(xiàn)
- setutils 工具庫:IndexedSet 類型
- socketutils 工具庫:socket 包裝紙
- statsutils 工具庫:統(tǒng)計基本面
- strutils 工具庫:文本操作,涉及到方方面面,有非常多的工具函數(shù)
- tableutils 工具庫:2D數(shù)據(jù)結(jié)構(gòu)
- tbutils 工具庫:回溯跟蹤和調(diào)用堆棧,豐富的Tracebackinfo類實現(xiàn)了棧追蹤
- timeutils 工具庫:增加 datetime 對象處理能力
- typeutils 工具庫:類型處理
- urlutils 工具庫:結(jié)構(gòu)化URL,方便對 URL 進行處理
# 1. 如何安裝
安裝只需要一條命令
pip install boltons
# 2. 實用范例
Boltons 的工具庫函數(shù)非常多,不能一一舉例,本文只摘取一些明哥認為經(jīng)典的工具做為演示
遍歷日期
在 timeutils 工具庫中有一個 daterange 可以對日期進行遍歷,省去自己手動構(gòu)造日期
>> > from datetime import date
>> > from boltons.timeutils import daterange
>> >
>> > christmas = date(year=2022, month=12, day=25)
>> > new_year = date(year=2023, month=1, day=1)
>> > for day in daterange(christmas, new_year):
... print(repr(day))
...
datetime.date(2022, 12, 25)
datetime.date(2022, 12, 26)
datetime.date(2022, 12, 27)
datetime.date(2022, 12, 28)
datetime.date(2022, 12, 29)
datetime.date(2022, 12, 30)
datetime.date(2022, 12, 31)
當然,你也可以指定遍歷的間隔
>> > for day in daterange(date(2017, 5, 1), date(2017, 8, 1),
... step=(0, 1, 0), inclusive=True):
... print(repr(day))
...
datetime.date(2017, 5, 1)
datetime.date(2017, 6, 1)
datetime.date(2017, 7, 1)
datetime.date(2017, 8, 1)
其中參數(shù)的意義是:
- step (int):元組 (year, month, day) 。
- inclusive (bool) :是否包含 stop 的日期
范圍轉(zhuǎn)具體
在 libvirt 里的 xml 上的 CPU 上通常都是這樣表示的
如何將這種格式(emulatorpin 里的 cpuset)的范圍,直接轉(zhuǎn)成具體包含了哪些核呢?
使用 boltons 的 strutils 工具包的一個函數(shù)立馬搞定
>> > from boltons.strutils import parse_int_list
>> >
>> > parse_int_list('0,7,21-22,48,55,69-70')
[0, 7, 21, 22, 48, 55, 69, 70]
遞歸映射
iterutils 工具包里提供一個 remap 函數(shù),可用于遍歷和轉(zhuǎn)換嵌套結(jié)構(gòu)。
如下面這個例子,將刪除所有 value = None 的元素
>> > from pprint import pprint
>> >
>> > reviews = {'Star Trek': {'TNG': 10, 'DS9': 8.5, 'ENT': None},
... 'Babylon 5': 6, 'Dr. Who': None}
>> >
>> >
>> > from boltons.iterutils import remap
>> >
>> > pprint(remap(reviews, lambda p, k, v: v is not None))
{'Babylon 5': 6, 'Star Trek': {'DS9': 8.5, 'TNG': 10}}
與 remap 相似的函數(shù)還有一個 research,可用于遞歸匹配查找
假設(shè)有如下一個字典
root = {'a': {'b': 1, 'c': (2, 'd', 3)}, 'e': None}
此時我想找出所有 value 為整數(shù)的的項,可以這樣子實現(xiàn)
>> > from boltons.iterutils import research
> >>
>> > res = research(root, query=lambda p, k, v: isinstance(v, int))
>> > print(sorted(res))
[(('a', 'b'), 1), (('a', 'c', 0), 2), (('a', 'c', 2), 3)]
流式讀取多文件
如果你有多個文件需要連接起來處理,可以使用 ioutils 工具包里的 MultiFileReader
>> > from boltons.ioutils import MultiFileReader, BytesIO
>> >
>> > mfr = MultiFileReader(BytesIO(b'ab'), BytesIO(b'cd'), BytesIO(b'e'))
>> > mfr.read(3).decode('ascii')
'abc'
創(chuàng)建多級目錄
Linux 上可以使用 mkdir -p
命令來創(chuàng)建多級目錄,但若使用 Python 來實現(xiàn)這個功能其實是非常麻煩的,如果不斷的判斷,一級一級往下去創(chuàng)建
而在 boltons 上的 fileutils 工具包提供的 mkdir_p 函數(shù),可以達到 Linux 上 mkdir -p
絲滑體驗
>> > from boltons.fileutils import mkdir_p
>> >
>> > mkdir_p("/home/foo/bar/test")
URL結(jié)構(gòu)處理
一個 URL 由下面結(jié)構(gòu)組成
foo://user:pass@example.com:8042/over/there?name=ferret#nose
_/ _______/ _________/ __/_________/ _________/ __/
| | | | | | |
scheme userinfo host port path query fragment
當我想從 URL 中解析獲取部分內(nèi)容時,就要對該字符串進行正則匹配。
若使用 boltons 中的 urlutils 工具庫 中的 URL 類,可以很方便對獲取任何 url 構(gòu)成
>> > from boltons.urlutils import URL
>> >
>> > url = URL('foo://example.com:8042/over/there?name=ferret#nose')
>> > print(url.host)
example.com
>> >
>> > print(url.port)
8042
>> >
>> > print(url.path)
/over/there
>> >
>> > print(url.query_params)
QueryParamDict([('name', 'ferret')])
# 3. 寫在最后
Boltons 是純Python,如果你不想引入 Boltons 巨大的工具箱時,也不用擔心,每個模塊都是獨立的,沒有依賴關(guān)系,可以直接復制到項目中使用。Boltons 旨在為廣泛的基本功能提供最好的支持,是對標準庫的一個補充,并且將高級功能留給其他更加專業(yè)的第三方庫。推薦給大家使用!
-
緩存
+關(guān)注
關(guān)注
1文章
229瀏覽量
26635 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68236 -
工具
+關(guān)注
關(guān)注
4文章
307瀏覽量
27709 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84376
發(fā)布評論請先 登錄
相關(guān)推薦
評論