解鎖超能力:十個你一定要嘗試的 Python 庫
我用 Python 編程時間長了,總結出兩件事:
標準庫很好用。 但它也缺了一堆東西。 當然,你有 os、pathlib 和 itertools。但有些庫會讓你忍不住想:“為啥這不是默認自帶的?”
我說的不是那些大家都在吹的熱門庫,比如 tqdm、rich 或 loguru。不是。我要介紹的是那些隱藏的寶藏——讓你感覺 Python 一夜之間長出了新手腳的工具。
讓我們來加點超能力吧。
1. sh — 像調用函數一樣跑 Shell 命令
忘了 subprocess.Popen 的噩夢吧。用 sh,你可以像調用原生 Python 函數一樣運行 shell 命令。
import sh
print(sh.ls("-l", "/home/user"))
print(sh.git("status"))就這么簡單。沒有繁瑣的樣板代碼,也不用頭疼 stdout=subprocess.PIPE。
我有次用 5 行 sh 代碼替換了 80 行 subprocess 的爛攤子,感覺像把垃圾食品從食譜里刪了。
小貼士:結合生成器,你幾乎不用費力就能搞定實時日志處理管道。
2. sorcery — 告別樣板代碼
你有沒有經常寫些瑣碎代碼,比如 a, b, c = my_tuple 或者 attrs = vars(obj)?sorcery 讓你的代碼干凈、聲明式,讀起來像魔法。
from sorcery import dict_of, unpack_keys
a, b, c = unpack_keys(dict(a=1, b=2, c=3))
d = dict_of(a, b, c) # {'a': 1, 'b': 2, 'c': 3}如果 Python 有個“開發者體驗”部門,這庫昨天就該進標準庫了。
3. more_itertools — itertools 的超級進化版
想象它是練了一年后從健身房出來的 itertools。
from more_itertools import chunked, windowed
print(list(chunked(range(10), 3)))
# [[0,1,2], [3,4,5], [6,7,8], [9]]
print(list(windowed(range(5), 2)))
# [(0,1), (1,2), (2,3), (3,4)]我用這個庫只花 5 行代碼就搞定了面試風格的編程題,感覺有點不公平——就像用水槍大戰帶了把火箭筒。
4. maya — 讓時間處理不再痛苦
如果你跟 datetime 和 pytz 較量過,你就知道那感覺像是戴著烤箱手套做數學。
maya 讓時間處理變得人性化。
import maya
now = maya.now()
print(now.slang_date()) # 'today'
print(now.add(hours=5).iso8601())還能解析像“下周五下午3點”這樣的自然語言?內置支持。 這為啥不是標準庫,我永遠搞不懂。
5. bidict — 真正的雙向字典
你做過多少次這種事?
mapping = {"a": 1, "b": 2}
reverse = {v: k for k, v in mapping.items()}停。用 bidict 吧。
from bidict import bidict
b = bidict({"a": 1, "b": 2})
print(b.inverse[1]) # 'a'這個小巧的庫救我于數據結構 hack 的水深火熱,次數多到我數不清。
6. parsy — 一個不會讓你哭的解析器組合庫
在 Python 里寫解析器通常像嚼玻璃。有了 parsy,優雅得很。
from parsy import string, regex
word = regex(r"[a-zA-Z]+")
parser = word.sep_by(string(","))
print(parser.parse("one,two,three"))
# ['one', 'two', 'three']這庫讓你感覺像是打開了通往編譯器世界的大門。
7. boltons(但不是你想的那部分)
是的,我知道我說不提 boltons。但聽我說。很多人沒意識到這庫有多深。
from boltons.iterutils import bucketize
data = ["apple", "banana", "apricot", "blueberry"]
print(bucketize(data, key=lambda x: x[0]))
# {'a': ['apple', 'apricot'], 'b': ['banana', 'blueberry']}就像 Python 集合的瑞士軍刀。這里一半的功能都該住進 functools 或 collections 里。
8. tri.struct — 正確的數據類
忘了寫 init 的樣板代碼吧。忘了那些在默認值和繼承時卡殼的 dataclasses 吧。
import tri.struct
class Person(tri.struct.Struct):
name = ''
age = 0
p = Person(name="Alice", age=30)
print(p)這就是 dataclasses,但用起來真順手。
9. cytoolz — 速度狂魔的函數式工具
你可能知道 toolz。cytoolz 是它的邪惡雙胞胎——用 C 重寫,速度飛快。
from cytoolz import curry
@curry
def add(x, y): return x + y
add5 = add(5)
print(add5(10)) # 15當性能重要時,cytoolz 把純 Python 甩得遠遠的。
10. furl — 讓 URL 操作不再尖叫
用 urllib.parse 解析 URL 感覺像在雜耍電鋸。
furl 讓這事變得輕松:
from furl import furl
f = furl("https://example.com/page?x=1")
f.args['y'] = 2
print(f.url)
# 'https://example.com/page?x=1&y=2'第一次用這個庫,我把整個自制的 URL 工具模塊替換成一行 import,感覺像干了啥犯法的事。































