雖然才第三天,但我發現可愛又切題的 Ferris 真的不好找,腦中瞬間出現 Panik 慌章迷因,還好找到了這張不要慌張的貼紙,趕快貼在頭上開始今天的內容吧。
順帶一提,下面這個爆炸小朋友叫做 Corro the Unsafe Rusturchin,用來代表不安全模式的 Rust:
*Designed and sold by out-in-space
Rust 中的 "panic" 是一種執行時錯誤處理機制,它表示程式在執行過程中遇到了無法處理的錯誤或不合法的狀態,導致程式無法繼續正常執行。當一個 panic 發生時,Rust 會執行一系列的操作,包括展開呼叫堆疊(unwinding the call stack)並終止程式的執行。這個過程通常會導致程式崩潰,但 Rust 的設計目標是盡量在 panic 時提供更多的安全性和可預測性。
接下來的幾天,每天會以一個工作時會遇到的情境作為主題,比較 Rust 跟 Python 在此情境的差異,而在這個階段的尾聲會得到一個基本的 GitHub 模板,之後每次就可以用它開啟新的專案。
今天的情境是報到完,拿到新的電腦,要來設定一下工作環境了,這邊為了說明方便,就假設使用的是 Unix 或 Unix-like 作業系統,首先來看看要讓 Python 可以開始進行開發會遇到什麼情況。
我們沒有真的要安裝 Python,但有經驗的人應該都聽過不只一種安裝方法,而每種都好像沒那麼直覺,甚至連 Wikimedia Foundation (負責營運維基百科) 的機器學習總監 Chris Albon 都搞不懂:
*X (former Twitter) by Santiago Víquez
安裝好 Python 之後,虛擬環境又是一團手忙腳亂,光是常用的 Conda 就有 Anaconda, Miniconda, Miniforge 三種常見的選擇,走了這條路又要想想函式庫要用 conda install
還是 pip install
安裝 (P.S. 使用 python -m pip install
比直接使用 pip install
還好,詳細請參考 Why you should use python -m pip)。
假設我們單純一點使用標準函式庫的 venv,一般會搭配 requirements.txt
來管理函式庫,但維護更新 requirements.txt
卻是一件麻煩事,如果函式庫還依照用途進一步分成了開發跟產品化兩種,我們可能還需要有另一個 requirements-dev.txt
來區分兩個不同環境的函式庫,手動維護起來絕對會瘋掉。
這時候聰明的小朋友就會問了,那我用官方推薦的 Pipenv 呢?
可是上次在網路上看人家說 Poetry 也很讚,是不是真的會瘋掉 (這部分詳細請參考 2021年了,該如何配置 Python 開發環境 - Part 2 Python 套件管理)。
好啦,這部分搞定之後,還要設定 black 來修正程式碼風格問題、flake8 檢查其他有的沒的問題,再嚴謹一點用 mypy 做一下靜態型別檢查看看型別註解有沒有寫對,最後再來個 darglint 來檢查 docstring 問題 (啊對了,它在 2022/12/16 已經宣佈不再維護,但 Ruff 打算實作其規則,所以這裡改用 Ruff。),然後再把這些有的沒的放進 pre-commit 省得麻煩 (延伸閱讀:提升程式碼品質:使用 Pre-Commit (Git Hooks))。
經過幾次迷你精神崩潰,把上面都搞定之後,我們再來想想要用 Pytest 還是 Unittest 做測試吧!
上面的例子雖然比較誇大,有許多工具可用也未嘗不是件好事,但這些瑣碎的事情加起來就是滿費工的。
這時候看到 Rust 的情境就可以感覺到其中的天差地別!
在使用 rustup 安裝 Rust,詳細步驟如下:
沒了,跟把大象裝進冰箱一樣簡單三步驟,唯一的差別在於 Rust 真的這樣就安裝好了!
噢對,還有函式庫要怎麼管理?
這部分也超級簡單,不需要安裝新的東西,要建立新的專案只需要在終端機執行 cargo new <project_name>
就會自動生成以下資料夾結構:
其中 target/debug/
資料夾中與專案名稱相同的檔案就是編譯好的可執行檔 (要至少執行過一次 cargo build
才有)。
而每個新建的資料夾就是自己的小天地,不用再擔心虛擬環境怎麼用,函式庫管理也只需要在 cargo.toml
中管理即可,例如:
[package]
name = "hello-world"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
polars = "0.33.2"
老實說,剛剛三個步驟也把 linter, formatter, packaging tool, documentation tools 都好了,甚至連 .bashrc
(假設用 bash 啦,用 zsh 也一樣會搞定 .zshenv
) 都設定好了!
是不是差很多,這樣就搞定了,剩下的時間就可以安裝一些 IDE 的延伸模組,選一些漂亮的佈景主題了 (推薦 Lunar Pink,很漂釀)。
cargo.toml
更加輕鬆。好啦,今天就先這樣,明天見啦!