問題
記住:無論何時你在pytorch中有一個張量tensor,你應該始終問一個問題:它當前位于哪里?
注意它在CPU還是在GPU中。
要判斷它在哪里,可以使用python的assert斷言語句。
assert斷言
在 Python 中,assert
是一個調試輔助工具,用于在代碼中設置檢查點。它的核心作用是驗證某個條件是否為真,如果條件為假則立即拋出 AssertionError
異常。
基本語法
assert condition, message
- condition:要測試的條件表達式(返回布爾值)
- message(可選):斷言失敗時顯示的錯誤信息(字符串)
工作原理
- 當
condition
為True
時,程序繼續執行 - 當
condition
為False
時:- 立即拋出
AssertionError
- 若有
message
,則將其作為異常信息輸出
- 立即拋出
注意: 在運行python代碼時通過 python -O
或 python -OO
運行程序可全局禁用斷言。這意味著在優化模式(__debug__為False)下,所有的assert語句都不會被執行。
IDE 的 “Debug 運行” 按鈕 ≠ Python 的 Debug 模式
- IDE 的 Debug 按鈕:啟動調試器(可設置斷點、單步執行)
- Python 的 Debug 模式:由
__debug__
標志控制,決定assert
是否生效
示例代碼
# 驗證輸入值非負
def calculate_square_root(x):assert x >= 0, "輸入不能為負數"return x ** 0.5print(calculate_square_root(4)) # 正常執行
print(calculate_square_root(-1)) # 觸發 AssertionError
輸出結果
2.0
Traceback (most recent call last):File "demo.py", line 6, in <module>print(calculate_square_root(-1))File "demo.py", line 2, in calculate_square_rootassert x >= 0, "輸入不能為負數"
AssertionError: 輸入不能為負數
關鍵特性
- 調試工具:用于捕獲程序中的邏輯錯誤
- 可禁用性:
- 通過
python -O
或python -OO
運行程序可全局禁用斷言 - 禁用后所有
assert
語句會被解釋器忽略
- 通過
- 非錯誤處理機制:
- 不應替代常規的異常處理(如
try/except
) - 不能用于驗證用戶輸入或外部數據
- 不應替代常規的異常處理(如
典型使用場景
-
驗證函數參數有效性
def process_data(data):assert isinstance(data, list), "需要列表類型輸入"# 處理邏輯
-
檢查中間狀態
def transform(values):result = complex_operation(values)assert len(result) == len(values), "數據長度不一致"return result
-
測試不變性條件
class Account:def withdraw(self, amount):new_balance = self.balance - amountassert new_balance >= 0, "余額不足"self.balance = new_balance
注意事項
-
生產環境慎用:
- 斷言可能被全局禁用,不可依賴其進行安全檢查
- 重要檢查應使用常規異常
# 生產環境推薦寫法 if x < 0:raise ValueError("輸入不能為負數")
-
錯誤信息優化:
- 添加有意義的錯誤信息便于調試
assert len(items) > 0, f"獲得空列表,當前項目: {items}"
-
性能影響:
- 斷言語句會增加執行開銷
- 在性能關鍵代碼中避免過度使用
與異常處理的區別
特性 | assert | 常規異常 (try/except ) |
---|---|---|
設計目的 | 調試期間捕獲程序錯誤 | 處理預期可能發生的錯誤情況 |
生產環境行為 | 可被全局禁用 | 始終生效 |
適用場景 | 檢查"不可能發生"的條件 | 驗證用戶輸入/外部資源等 |
錯誤類型 | 固定拋出 AssertionError | 可拋出任意異常類型 |
最佳實踐:將
assert
視為代碼中的即時文檔和調試助手,而非生產環境的錯誤處理機制。
在 Python 中,assert
是一個調試輔助工具,用于在代碼中設置檢查點。它的核心作用是驗證某個條件是否為真,如果條件為假則立即拋出 AssertionError
異常。