Pytype comprueba e infiere tipos para su código Python, sin necesidad de anotaciones de tipo. Pytype puede:
Pytype es un analizador estático; no ejecuta el código en el que se ejecuta.
Miles de proyectos de Google dependen de pytype para mantener su código Python bien escrito y sin errores.
Para obtener más información, consulte la guía del usuario, las preguntas frecuentes o las funciones compatibles.
Pytype usa inferencia en lugar de escritura gradual. Esto significa que inferirá tipos en el código incluso cuando el código no tenga sugerencias de tipo. Por lo tanto, puede detectar problemas con código como este, que otros verificadores de tipos pasarían por alto:
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 es indulgente en lugar de estricto. Eso significa que permite todas las operaciones que tienen éxito en tiempo de ejecución y no contradicen las anotaciones. Por ejemplo, este código pasará como seguro en pytype, pero fallará en otros verificadores de tipos, que asignan tipos a variables tan pronto como se inicializan:
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"
Consulte también la entrada de preguntas frecuentes correspondiente.
Para comenzar rápidamente con la verificación de tipo de un archivo o directorio, ejecute lo siguiente, reemplazando file_or_directory
con su entrada:
pip install pytype
pytype file_or_directory
Para configurar pytype en un paquete completo, agregue lo siguiente a un archivo pyproject.toml
en el directorio inmediatamente encima del paquete, reemplazando package_name
con el nombre del paquete:
[ tool . pytype ]
inputs = [ ' package_name ' ]
Ahora puede ejecutar el comando sin argumentos pytype
para verificar el tipo de paquete. También es fácil agregar pytype a sus pruebas automatizadas; vea este ejemplo de un proyecto de GitHub que ejecuta pytype en GitHub Actions.
Finalmente, pytype genera archivos de información de tipo inferido, ubicados por defecto en .pytype/pyi
. Puede utilizar esta información para escribir anotaciones en el archivo fuente correspondiente:
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
Necesita un intérprete de Python 3.8-3.12 para ejecutar pytype, así como un intérprete en $PATH
para la versión de Python del código que está analizando (compatible: 3.8-3.12).
Soporte de plataforma:
* En Alpine Linux, la instalación puede fallar debido a problemas con las dependencias ascendentes. Consulte los detalles de este problema para conocer una posible solución.
** Si la dependencia ninja no se instala, asegúrese de que cmake esté instalado. Consulte este número para obtener más detalles.
Pytype se puede instalar mediante pip. Tenga en cuenta que la instalación requiere wheel
y setuptools
. (Si está trabajando en un entorno virtual, estos dos paquetes ya deberían estar presentes).
pip install pytype
O desde el código fuente en GitHub.
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
En lugar de usar --recurse-submodules
, también podrías haber ejecutado
git submodule init
git submodule update
en el directorio pytype
. Para editar el código y realizar un seguimiento de sus ediciones en vivo, reemplace el comando pip install con:
pip install -e .
Siga los pasos anteriores, pero primero asegúrese de tener las bibliotecas correctas:
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
Opciones comunes:
-V, --python-version
: versión Python (mayor.menor) del código de destino. El valor predeterminado es la versión con la que se ejecuta pytype.-o, --output
: el directorio al que va toda la salida de pytype, incluidos los archivos .pyi generados. El valor predeterminado es .pytype
.-d, --disable
. Lista separada por comas o espacios de nombres de errores que se deben ignorar. En este documento se encuentran explicaciones detalladas de los nombres de error de pytype. El valor predeterminado es vacío. Para obtener una lista completa de opciones, ejecute pytype --help
.
Además de lo anterior, puede indicarle a pytype que use una instalación tipográfica personalizada en lugar de su propia copia empaquetada configurando $TYPESHED_HOME
.
Para mayor comodidad, puede guardar su configuración de pytype en un archivo. El archivo de configuración puede ser un archivo de estilo TOML con una sección [tool.pytype]
(preferido) o un archivo de estilo INI con una sección [pytype]
. Si no se proporciona un archivo de configuración explícito, pytype buscará una sección de pytype en el primer archivo pyproject.toml
o setup.cfg
que encuentre caminando hacia arriba desde el directorio de trabajo actual.
Comience generando un archivo de configuración de muestra:
$ pytype --generate-config pytype.toml
Ahora personalice el archivo según su configuración local, manteniendo solo las secciones que necesita. Los directorios pueden ser relativos a la ubicación del archivo de configuración, lo cual es útil si desea registrar el archivo de configuración como parte de su proyecto.
Por ejemplo, supongamos que tiene la siguiente estructura de directorios y desea analizar el paquete ~/repo1/foo
, que depende del paquete ~/repo2/bar
:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
Aquí está el archivo de configuración completo, que indica a pytype que escriba ~/repo1/foo
como código Python 3.9, busque paquetes en ~/repo1
y ~/repo2
e ignore los errores de atributos. Observe que la ruta a un paquete no incluye el paquete en sí.
$ 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 ' ,
]
Podríamos haber descubierto que ~/repo2
necesitaba agregarse a pythonpath ejecutando el verificador de dependencias rotas de pytype:
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
Pytype viene con algunos scripts además del propio pytype
:
annotate-ast
, un anotador de tipo en progreso para AST.merge-pyi
, para fusionar información de tipo de un archivo .pyi en un archivo Python.pytd-tool
, un analizador de archivos .pyi.pytype-single
, una herramienta de depuración para desarrolladores de pytype, que analiza un único archivo Python suponiendo que ya se han generado archivos .pyi para todas sus dependencias.pyxref
, un generador de referencias cruzadas. apache 2.0
Este no es un producto oficial de Google.