Pytype 檢查並推斷 Python 程式碼的類型 - 無需類型註解。 Pytype 可以:
Pytype是一個靜態分析器;它不執行它所運行的程式碼。
Google 的數千個專案都依賴 pytype 來保持其 Python 程式碼類型正確且無錯誤。
有關更多信息,請查看用戶指南、常見問題解答或支援的功能。
Pytype 使用推理而不是逐步打字。這意味著即使程式碼沒有類型提示,它也會推斷程式碼的類型。因此它可以檢測這樣的程式碼問題,而其他類型檢查器會錯過這些問題:
def f ():
return "PyCon"
def g ():
return f () + 2019
# pytype: line 4, in g: unsupported operand type(s) for +: 'str'
# and 'int' [unsupported-operands]
Pytype 是寬鬆的而不是嚴格的。這意味著它允許所有操作在運行時成功並且不與註釋相矛盾。例如,此程式碼在 pytype 中將安全地通過,但在其他類型檢查器中失敗,這些類型檢查器在變數初始化後立即將類型指派給變數:
from typing import List
def get_list () -> List [ str ]:
lst = [ "PyCon" ]
lst . append ( 2019 )
return [ str ( x ) for x in lst ]
# mypy: line 4: error: Argument 1 to "append" of "list" has
# incompatible type "int"; expected "str"
另請參閱相應的常見問題解答條目。
若要快速開始對檔案或目錄進行類型檢查,請執行以下命令,並將file_or_directory
替換為您的輸入:
pip install pytype
pytype file_or_directory
若要在整個套件上設定 pytype,請將以下內容新增至套件上方目錄中的pyproject.toml
檔案中,並將package_name
替換為套件名稱:
[ tool . pytype ]
inputs = [ ' package_name ' ]
現在您可以執行無參數命令pytype
對包進行類型檢查。將 pytype 添加到自動化測試中也很容易;請參閱在 GitHub Actions 上執行 pytype 的 GitHub 專案範例。
最後, pytype 產生推斷類型資訊的文件,預設位於.pytype/pyi
中。您可以使用此資訊對相應的來源文件進行類型註釋:
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
您需要一個 Python 3.8-3.12 解釋器來運行 pytype,以及$PATH
中用於您正在分析的程式碼的 Python 版本的解釋器(支援:3.8-3.12)。
平台支援:
* 在 Alpine Linux 上,安裝可能會因為上游相依性問題而失敗。請參閱此問題的詳細資訊以取得可能的解決方案。
** 如果 ninja 依賴項安裝失敗,請確保 cmake 已安裝。詳情請參閱本期。
Pytype 可以透過 pip 安裝。請注意,安裝需要wheel
和setuptools
。 (如果您在 virtualenv 中工作,這兩個套件應該已經存在。)
pip install pytype
或來自 GitHub 上的源代碼。
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
您也可以運行而不是使用--recurse-submodules
git submodule init
git submodule update
在pytype
目錄中。若要編輯程式碼並即時追蹤您的編輯,請將 pip install 命令替換為:
pip install -e .
按照上述步驟操作,但首先確保您擁有正確的庫:
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
常用選項:
-V, --python-version
:目標程式碼的Python版本(主要.次要)。預設為 pytype 運行時的版本。-o, --output
:所有 pytype 輸出所在的目錄,包括產生的 .pyi 檔案。預設為.pytype
。-d, --disable
。要忽略的錯誤名稱的逗號或空格分隔清單。 pytype 錯誤名稱的詳細解釋在此文件中。預設為空。有關選項的完整列表,請執行pytype --help
。
除了上述之外,您還可以透過設定$TYPESHED_HOME
來指示 pytype 使用自訂 typeshed 安裝,而不是自己的捆綁副本。
為了方便起見,您可以將 pytype 配置保存在檔案中。設定檔可以是帶有[tool.pytype]
部分(首選)的 TOML 樣式文件,也可以是帶有[pytype]
部分的 INI 樣式文件。如果未提供明確設定文件,pytype 將從目前工作目錄向上查找,在第一個pyproject.toml
或setup.cfg
檔案中尋找 pytype 部分。
首先產生一個範例設定檔:
$ pytype --generate-config pytype.toml
現在根據您的本地設定自訂文件,僅保留您需要的部分。目錄可能與設定檔的位置相關,如果您想將設定檔作為專案的一部分簽入,這很有用。
例如,假設您有以下目錄結構並想要分析套件~/repo1/foo
,它依賴套件~/repo2/bar
:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
這是填寫的設定文件,它指示 pytype 將~/repo1/foo
作為 Python 3.9 程式碼進行類型檢查,在~/repo1
和~/repo2
中尋找包,並忽略屬性錯誤。請注意,包的路徑不包括包本身。
$ cat ~/repo1/pytype.toml
# NOTE: All relative paths are relative to the location of this file.
[ tool . pytype ]
# Space-separated list of files or directories to process.
inputs = [
' foo ' ,
]
# Python version (major.minor) of the target code.
python_version = ' 3.9 '
# Paths to source code directories, separated by ':'.
pythonpath = . :~/repo2
# Space-separated list of error names to ignore.
disable = [
' attribute-error ' ,
]
我們可能已經發現~/repo2
需要透過執行 pytype 的損壞依賴檢查器來加入到 pythonpath 中:
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
除了pytype
本身之外,Pytype 還附帶了一些腳本:
annotate-ast
,一個正在進行的 AST 類型註釋器。merge-pyi
,用於將 .pyi 檔案中的類型資訊合併到 Python 檔案中。pytd-tool
,.pyi 檔案的解析器。pytype-single
是 pytype 開發人員的偵錯工具,它分析單一 Python 文件,假設已經為其所有相依性產生了 .pyi 文件。pyxref
,交叉引用生成器。 阿帕契2.0
這不是 Google 官方產品。