繼上次的草稿後該來個決定版了
- Where to find Python code
- Install package
- IDE (plus interactive shell and editor)
- Documentation and naming
- Type Hinting
- Testing (and linting?)
- Debugging
- Logging
- Optimization (sounds more like profiling)
- Algorithm and Data Structure
- Python Distributions
- Source Control
- Distributing Python Program
- Learn more
這次的內容非常的多,讀書會的一個小時是一定吸收不完的
但先聽過,知道 Python 有這些東西可以用,也許以後會有幫助
我會頻繁參照四年前寫的 Python Table Manners 系列
提到的工具稍微有些過期,這篇文章會補充新的工具
但概念本身是互通的
Where to find Python code
- PyPI
- Python Package Index
- 讀作 Py-P-I
pip install <package>
預設會到 PyPI 找套件安裝- 遠古以前曾經叫做 "cheese shop"
- 來自 Monty Python
- Python Package Index
- GitHub Trend
- GitHub 是目前主流的 Git 倉儲,在這可以找到最近流行的 Python 專案
- Popular Python recipes
- 這就真的是第一次看到了
Install package
- pip
- e.g.,
pip install pip
- e.g.,
- pipenv
- pip + virtualenv
- system package management (Don't. Just Don't. Please)
- conda
- 直接從原始碼建置
- poetry
- 包含打包並發布函式庫的功能
- uv
- pipx (just notice Josix wrote a blog post for it)
- 主要用於安裝 Python 實作的指令列工具,而不是函示庫
pipenv, poetry 跟 pipx 更多的介紹可以參考 Python Table Manners - 虛擬環境和套件管理
IDE (plus interactive shell and editor)
- IDLE
Python 自帶的編輯器,在終端機輸入 IDLE
就能開啟
- PyCharm
- IPython
- 這應該是互動式 shell,不算是 IDE 🤔
- Jupyter Notebook
- Jupyter Lab
- Vim / NeoVim
- 編輯器的神
- VsCode
大致上學習曲線如下(PyCharm可以參考 IntelliJ)
👉 Python Table Manners 番外 - 編輯器
Documentation and naming
- PEP8
- Python 的程式碼風格指南
- 建議演講: Raymond Hettinger - Beyond PEP 8
- 建議讀物: Clean Code
- 雖然這本主要是用 Java 為範例,但概念本身對寫好程式很有幫助
這章的標題「名稱與文件」,但內容主要在講註解跟命名
很微妙的翻譯
但如果對真的寫文件有興趣,可以參考 Python Table Manners - 文件
Type Hinting
👉 Python Table Manners - 程式碼風格 # 型別檢查 - mypy
除此之外,自從 Python 3.9,型別如 list, dict, set
都可以直接被使用
不用再從 typing 函式庫匯入 (i.e., from typing import List, Dict, Set
)
example_list: list[int] = [1, 2, 3]
如果你用的是 Python 3.8 ,你可以在檔案最上方
from __future__ import annotations
如果你用的是 3.8 以前的版本,那你應該升級你的 Python
(3.7 在 2023 就已經不支援了)
Testing (and linting?)
- print
- 不要在 production 使用 print
- pylint, pyflakes, flake8, pep8, black
- 👉 Python Table Manners - 程式碼風格
- 不過在 4202 年的現在,我推薦使用 ruff 取代以上所有工具
- testing
- 為什麼要測試
- stdlib
- nose
- tox
- 本身不是測試框架
- 主要用來做任務管理
- 特點是可以在多個 Python 版本執行任務(包含測試)
- py.test
- 目前最主流的 Python 測試框架,一般會建議使用它
- green
- hypothesis
- Property-based testing
- 相當有趣的概念,但我其實也沒用到很熟
- Continuous Integration (CI)
Debugging
- print
vars()
: 列出變數的__dict__
locals()
: 列出局部變數globals()
: 列出全域變數
- decorator
import functools
import logging
def debug(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("before function starts")
result = func(*args, **kwargs)
print("after function ends")
return result
return wrapper
@debug
def func():
pass
- pdb
- 常用 pdb 指令
c
ontinues
kipn
extl
istp
rint
- 中斷點
- 在 Python 檔案中加入
breakpoint()
,可以在執行時停在那行,並進入 pdb 互動式介面
- 在 Python 檔案中加入
- 常用 pdb 指令
# how to use pdb in terminal
## run pdb on file
pdb <file name>
## run pdb on module
pdb -m <module name>
Logging
- logging
- message: 日誌訊息
- level: 日誌等級
- logger
- handler: 對日誌做額外的處理(e.g., 輸出成檔案)
- formatter: 日誌格式
- filter: 過濾特定日誌
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(filename="example.log", encoding="utf-8", level=logging.DEBUG)
logger.debug("This message should go to the log file")
logger.info("So should this")
logger.warning("And this, too")
logger.error("And non-ASCII stuff, too, like Øresund and Malmö")
Optimization (sounds more like profiling)
- "Python 通常很快"
- 我不確定,即使身為一個 Python 忠貞的使用者,我認為很多人會認為這句話不成立 lol
- time, timeit
- 參考 Debugging decorator 的寫法,可以將它們實作成 decorator 或 context manager,計算函式執行時間,找出瓶頸
Algorithm and Data Structure
- list comprehension 通常比較快
- 這章也是很微妙,我不能說跟演算法、資料結構無關,但...就這?
Python Distributions
Source Control
- Mercurial
- Git
init
add
status
commit
- commitizen 可以幫助你寫更好的提交訊息 (commit message)!
- 👉 Basic Git Tutorial (雖然已經是 8 年前的文章了,但基礎概念應該是沒變太多吧...)
Distributing Python Program
- 這章其實沒講什麼...
- 可以研究看看怎麼將套件上傳到 PyPI
Learn more
- books
- Websites
- Community
- PyLadies
- PyCons
- local meetups
- Jobs
- you'll find your way out