Pytype vérifie et déduit les types de votre code Python - sans nécessiter d'annotations de type. Pytype peut :
Pytype est un analyseur statique ; il n'exécute pas le code sur lequel il s'exécute.
Des milliers de projets chez Google s'appuient sur pytype pour que leur code Python soit bien typé et sans erreur.
Pour plus d'informations, consultez le guide de l'utilisateur, la FAQ ou les fonctionnalités prises en charge.
Pytype utilise l'inférence au lieu du typage progressif. Cela signifie qu'il déduira les types sur le code même si le code ne contient aucune indication de type. Il peut donc détecter des problèmes avec du code comme celui-ci, que d'autres vérificateurs de type manqueraient :
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 est indulgent au lieu d'être strict. Cela signifie qu'il autorise toutes les opérations qui réussissent au moment de l'exécution et ne contredisent pas les annotations. Par exemple, ce code sera considéré comme sûr dans pytype, mais échouera dans d'autres vérificateurs de types, qui attribuent des types aux variables dès leur initialisation :
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"
Consultez également l’entrée FAQ correspondante.
Pour commencer rapidement à vérifier le type d'un fichier ou d'un répertoire, exécutez ce qui suit, en remplaçant file_or_directory
par votre entrée :
pip install pytype
pytype file_or_directory
Pour configurer pytype sur un package entier, ajoutez ce qui suit à un fichier pyproject.toml
dans le répertoire immédiatement au-dessus du package, en remplaçant package_name
par le nom du package :
[ tool . pytype ]
inputs = [ ' package_name ' ]
Vous pouvez maintenant exécuter la commande sans argument pytype
pour vérifier le type du package. Il est également facile d'ajouter pytype à vos tests automatisés ; voir cet exemple de projet GitHub qui exécute pytype sur GitHub Actions.
Enfin, pytype génère des fichiers d'informations de type déduit, situés par défaut dans .pytype/pyi
. Vous pouvez utiliser ces informations pour annoter le fichier source correspondant :
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
Vous avez besoin d'un interpréteur Python 3.8-3.12 pour exécuter pytype, ainsi que d'un interpréteur dans $PATH
pour la version Python du code que vous analysez (prise en charge : 3.8-3.12).
Prise en charge de la plateforme :
* Sous Alpine Linux, l'installation peut échouer en raison de problèmes de dépendances en amont. Consultez les détails de ce problème pour une solution possible.
** Si l'installation de la dépendance ninja échoue, assurez-vous que cmake est installé. Voir ce problème pour plus de détails.
Pytype peut être installé via pip. Notez que l'installation nécessite wheel
et setuptools
. (Si vous travaillez dans un virtualenv, ces deux packages devraient déjà être présents.)
pip install pytype
Ou à partir du code source sur GitHub.
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
Au lieu d'utiliser --recurse-submodules
, vous auriez également pu exécuter
git submodule init
git submodule update
dans le répertoire pytype
. Pour modifier le code et suivre vos modifications en direct, remplacez la commande pip install par :
pip install -e .
Suivez les étapes ci-dessus, mais assurez-vous d’abord d’avoir les bonnes bibliothèques :
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
Options courantes :
-V, --python-version
: version Python (major.minor) du code cible. La valeur par défaut est la version sous laquelle pytype est exécuté.-o, --output
: Le répertoire dans lequel vont toutes les sorties pytype, y compris les fichiers .pyi générés. La valeur par défaut est .pytype
.-d, --disable
. Liste de noms d'erreurs à ignorer, séparés par des virgules ou des espaces. Des explications détaillées sur les noms d'erreur de pytype se trouvent dans ce document. La valeur par défaut est vide. Pour une liste complète des options, exécutez pytype --help
.
En plus de ce qui précède, vous pouvez demander à pytype d'utiliser une installation typée personnalisée au lieu de sa propre copie groupée en définissant $TYPESHED_HOME
.
Pour plus de commodité, vous pouvez enregistrer votre configuration pytype dans un fichier. Le fichier de configuration peut être un fichier de style TOML avec une section [tool.pytype]
(de préférence) ou un fichier de style INI avec une section [pytype]
. Si un fichier de configuration explicite n'est pas fourni, pytype recherchera une section pytype dans le premier fichier pyproject.toml
ou setup.cfg
trouvé en remontant du répertoire de travail actuel.
Commencez par générer un exemple de fichier de configuration :
$ pytype --generate-config pytype.toml
Personnalisez maintenant le fichier en fonction de votre configuration locale, en ne conservant que les sections dont vous avez besoin. Les répertoires peuvent être relatifs à l'emplacement du fichier de configuration, ce qui est utile si vous souhaitez archiver le fichier de configuration dans le cadre de votre projet.
Par exemple, supposons que vous ayez la structure de répertoires suivante et que vous souhaitiez analyser le package ~/repo1/foo
, qui dépend du package ~/repo2/bar
:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
Voici le fichier de configuration rempli, qui demande à pytype de vérifier ~/repo1/foo
en tant que code Python 3.9, de rechercher les packages dans ~/repo1
et ~/repo2
et d'ignorer les erreurs d'attribut. Notez que le chemin d’accès à un package n’inclut pas le package lui-même.
$ 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 ' ,
]
Nous aurions pu découvrir que ~/repo2
devait être ajouté au chemin python en exécutant le vérificateur de dépendances défectueux de pytype :
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
Pytype est livré avec quelques scripts en plus de pytype
lui-même :
annotate-ast
, un annotateur de type en cours pour les AST.merge-pyi
, pour fusionner les informations de type d'un fichier .pyi dans un fichier Python.pytd-tool
, un analyseur pour les fichiers .pyi.pytype-single
, un outil de débogage pour les développeurs pytype, qui analyse un seul fichier Python en supposant que les fichiers .pyi ont déjà été générés pour toutes ses dépendances.pyxref
, un générateur de références croisées. Apache2.0
Ce n'est pas un produit Google officiel.