Pytype проверяет и выводит типы вашего кода Python, не требуя аннотаций типов. Питайп может:
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, который запускает 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
. (Если вы работаете в виртуальной среде, эти два пакета уже должны присутствовать.)
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 (major.minor) целевого кода. По умолчанию используется версия, под которой работает pytype.-o, --output
: каталог, в который помещаются все выходные данные pytype, включая сгенерированные файлы .pyi. По умолчанию .pytype
.-d, --disable
. Список имен ошибок, разделенных запятыми или пробелами, которые следует игнорировать. Подробные объяснения названий ошибок pytype приведены в этом документе. По умолчанию пусто. Чтобы просмотреть полный список параметров, запустите pytype --help
.
В дополнение к вышесказанному вы можете указать pytype использовать пользовательскую установку typeshed вместо собственной связанной копии, установив $TYPESHED_HOME
.
Для удобства вы можете сохранить конфигурацию pytype в файле. Файл конфигурации может представлять собой файл в стиле TOML с разделом [tool.pytype]
(предпочтительно) или файл в стиле INI с разделом [pytype]
. Если явный файл конфигурации не указан, pytype будет искать раздел pytype в первом файле pyproject.toml
или setup.cfg
, найденном при переходе вверх из текущего рабочего каталога.
Начните с создания примера файла конфигурации:
$ 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
необходимо добавить в путь Python, запустив проверку сломанных зависимостей pytype:
$ 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.