Stories

Detail Return Return

我的Python工具箱,不用加班的秘密 - Stories Detail

一個程序員的成長,除了寫代碼,很大一部分也在於不斷髮現和運用更好的工具。分享8個大大提高工作效率的工具,同事還在加班的時候,你都回到家了。

ServBay:本地開發環境的基石

無論做什麼開發,一個穩定、隔離、易於管理的環境都是基礎。ServBay幫我把這個基礎打得非常牢固。

image.png

  • 多版本共存:我可以在一台電腦上同時安裝和運行多個Python版本,維護老項目用2.7,新項目就用3.11,互不干擾。如果你是個全棧開發者,還可以一鍵安裝其他語言,無論是開發還是做測試都非常方便。
  • 服務全家桶:除了Python,它還集成了我常用的數據庫(MySQL、MariaDB, PostgreSQL)、緩存(Redis)等服務。我不用再為每個服務單獨安裝和配置,在一個地方就能全部搞定。
  • 一鍵切換和管理:它的圖形界面支持一鍵切換Rust、Python等各種常用開發語言,啓動停止服務這些操作變得非常直觀,點幾下鼠標就行。

image.png

  • 一鍵安裝本地 AI 一鍵安裝和運行DeepSeek、Qwen 3、Llama 3等這類開源大模型。想在本地跑個AI玩玩或者做開發,不需要折騰複雜的環境配置,點一下就行。

一句話點評:它是我本地開發環境的核心,幫我省去了大量在環境配置上折騰的時間。

Hypothesis:測試不再需要猜數據

寫單元測試時,通常會自己想幾個測試用例,比如測一個加法函數,可能會用assert add(2, 3) == 5,再加個負數assert add(-1, -5) == -6。但很難覆蓋所有邊界情況。Hypothesis這個庫改變了我的測試思路。

它會根據我定義的規則,自動生成成百上千個刁鑽的測試數據來攻擊我的函數,專門找那些我沒想到的邊界情況。

示例代碼:

from hypothesis import given
import hypothesis.strategies as st

def absolute_value(x):
    if x < 0:
        return -x
    return x

# 我告訴Hypothesis,用任意整數來測試我的函數
@given(st.integers())
def test_absolute_value_is_always_positive(x):
    # 我只定義規則:結果必須大於等於0
    assert absolute_value(x) >= 0

我不再需要手動寫 test_absolute_value(5)test_absolute_value(-10) 等等。Hypothesis會自動用0、-1、非常大的數、非常小的數去測試,一旦發現反例就會立刻報告。

一句話點評:它能幫我找到那些靠手寫測試用例幾乎不可能發現的隱藏bug。

MonkeyType:為老代碼自動加上類型註解

我接過一些沒有類型註解(Type Hints)的老項目,手動一個個加str, int不僅枯燥,還容易出錯。MonkeyType是Facebook開源的一個神器,它能通過運行代碼,觀察函數的輸入和輸出來自動生成類型註解。

我的使用流程通常是:

  1. monkeytype run 啓動我的測試腳本。
  2. MonkeyType會默默記錄下所有函數的調用和返回值類型。
  3. 測試跑完後,用 monkeytype apply my_module 命令,它就會把推斷出的類型註解寫回我的.py文件裏。

命令行用法:

# 1. 運行你的腳本,並讓MonkeyType收集類型信息
monkeytype run my_script.py

# 2. 將收集到的類型信息應用到你的模塊文件
monkeytype apply my_project.my_module

一句話點評:給沒有類型註解的舊代碼庫補充類型時,它能幫我完成80%的體力活。

DuckDuckGo Search:無需API Key的輕量級搜索庫

image.png

有時候,我需要寫個小工具,讓它能從網上搜索一些信息。通常這意味着要去申請Google或Bing的API Key,過程有點麻煩。Duck這個庫就非常輕便,它能直接調用DuckDuckGo的搜索功能,不需要任何API Key。

示例代碼:

from duckduckgo_search import DDGS

with DDGS() as ddgs:
    for r in ddgs.text('Python web scraping libraries', max_results=5):
        print(r['title'], r['href'])

就這麼幾行代碼,我就能拿到搜索結果的標題和鏈接,對於做一些簡單的數據聚合或信息查詢工具來説,簡直太方便了。

一句話點評:當我需要快速實現程序化搜索功能,又不想折騰API Key時,我就會用它。

Requests-HTML:一體化網頁解析庫

很多人熟悉用 Requests 庫獲取網頁,然後用BeautifulSoup來解析。Requests-HTML的作者和 Requests是同一個人,他把這兩個步驟合二為一了。獲取網頁後,可以直接在響應對象上用CSS選擇器來查找元素,代碼寫起來更連貫。

示例代碼:

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://python.org/')

# 獲取到響應後,直接用CSS選擇器找元素
intro = r.html.find('#intro', first=True)
print(intro.text)

# 還能直接拿到所有鏈接
for link in r.html.links:
    print(link)

一句話點評:對於不那麼複雜的爬蟲任務,它比requests + BeautifulSoup的組合拳更直接。

PGQueuer:用PostgreSQL就夠了,輕量級任務隊列

在Web開發中,處理耗時任務(比如發送郵件、處理視頻)時,通常會用到任務隊列,像Celery + Redis是很常見的組合。但有時我的項目很簡單,只用到了PostgreSQL數據庫,為了一個隊列功能再引入一個Redis服務,感覺有點重。

PGQueuer讓我可以直接用PostgreSQL來實現一個可靠的任務隊列。它足夠簡單,也足夠穩定。

示例代碼:

# --- 發送任務 ---
from pgqueuer import PGQueuer
queue = PGQueuer('postgresql://user:pass@host/dbname')
queue.put({'email': 'test@example.com', 'content': 'Hello!'})

# --- 工作進程 ---
# worker.py
while True:
    task = queue.get()
    if task:
        send_email(task.payload['email'], task.payload['content'])
        task.ack() # 確認任務完成

一句話點評:當我的項目裏已經有PostgreSQL,並且只需要一個簡單的後台任務隊列時,我用它來避免增加技術棧的複雜度。

Snoop:比print()更強大的調試魔法

調試代碼時,我以前也喜歡在函數里加一堆print()來看變量的變化。Snoop 其實是print()調試法的終極進化版。只需要在函數上加一個裝飾器,它就能在運行函數時,把每一步的執行過程、變量的來龍去脈都清清楚楚地打印出來。

示例代碼:

import snoop

@snoop
def factorial(x):
    if x == 1:
        return 1
    return x * factorial(x - 1)

factorial(4)

運行後,就會有非常詳細的函數調用過程和每一步x的值,比自己手動print省事多了,也清晰多了。

一句話點評:當我想快速搞懂一個複雜函數的內部執行邏輯時,Snoop 比打斷點或加一堆print更直觀。

PyWebView:用Python和Web技術輕鬆構建桌面應用

有時候我想把一個Web應用打包成桌面應用,但又覺得Electron太臃腫。PyWebView 是一個非常輕量的選擇,它能創建一個本地窗口,然後在裏面展示我的Web頁面(可以是本地的HTML/CSS/JS文件,也可以是一個在線URL)。

它利用的是操作系統自帶的瀏覽器內核(Windows上的Edge WebView2,macOS上的WebKit),所以打包出來的應用體積很小。

示例代碼:

import webview

# 創建一個窗口,加載指定的URL
webview.create_window('我的桌面應用', 'https://python.org')
webview.start()

這幾行代碼就能把一個網站變成一個獨立的桌面程序。它還能實現Python和JavaScript之間的雙向調用,可玩性很高。

一句話點評:當我需要快速地把Web項目包裝成一個輕量級桌面應用時,我會優先考慮它。

工具是死的,但解決問題的思路是活的。希望我分享的這些工具能給你帶來一些新思路,在你遇到類似問題時,能想起“哦,好像有個工具可以試試”。

user avatar king_wenzhinan Avatar huichangkudelingdai Avatar zero_dev Avatar solvep Avatar ldh-blog Avatar xiao2 Avatar writers Avatar dengjijie Avatar wmuhua Avatar lishisan Avatar barrior Avatar sadhuji Avatar
Favorites 26 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.