Pytype verifica e infere tipos para seu código Python - sem exigir anotações de tipo. Pytype pode:
Pytype é um analisador estático; ele não executa o código em que é executado.
Milhares de projetos no Google dependem do pytype para manter seu código Python bem digitado e livre de erros.
Para obter mais informações, consulte o guia do usuário, perguntas frequentes ou recursos suportados.
Pytype usa inferência em vez de digitação gradual. Isso significa que ele inferirá tipos no código mesmo quando o código não tiver dicas de tipo. Portanto, ele pode detectar problemas com códigos como este, que outros verificadores de tipo não perceberiam:
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 é tolerante em vez de rigoroso. Isso significa que permite todas as operações bem-sucedidas em tempo de execução e que não contradizem as anotações. Por exemplo, este código será aprovado como seguro em pytype, mas falhará em outros verificadores de tipo, que atribuem tipos a variáveis assim que elas são inicializadas:
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 também a entrada correspondente do FAQ.
Para começar rapidamente a verificar o tipo de um arquivo ou diretório, execute o seguinte, substituindo file_or_directory
pela sua entrada:
pip install pytype
pytype file_or_directory
Para configurar o pytype em um pacote inteiro, adicione o seguinte a um arquivo pyproject.toml
no diretório imediatamente acima do pacote, substituindo package_name
pelo nome do pacote:
[ tool . pytype ]
inputs = [ ' package_name ' ]
Agora você pode executar o comando sem argumento pytype
para verificar o tipo do pacote. Também é fácil adicionar pytype aos seus testes automatizados; veja este exemplo de um projeto GitHub que executa pytype em GitHub Actions.
Finalmente, pytype gera arquivos de informações de tipo inferido, localizados por padrão em .pytype/pyi
. Você pode usar essas informações para anotar o tipo do arquivo de origem correspondente:
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
Você precisa de um interpretador Python 3.8-3.12 para executar o pytype, bem como um interpretador em $PATH
para a versão Python do código que você está analisando (suportado: 3.8-3.12).
Suporte de plataforma:
* No Alpine Linux, a instalação pode falhar devido a problemas com dependências upstream. Veja os detalhes deste problema para uma possível correção.
** Se a dependência ninja falhar na instalação, certifique-se de que o cmake esteja instalado. Consulte este problema para obter detalhes.
Pytype pode ser instalado via pip. Observe que a instalação requer wheel
e setuptools
. (Se você estiver trabalhando em um virtualenv, esses dois pacotes já deverão estar presentes.)
pip install pytype
Ou do código-fonte no GitHub.
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
Em vez de usar --recurse-submodules
, você também poderia ter executado
git submodule init
git submodule update
no diretório pytype
. Para editar o código e ter suas edições rastreadas ao vivo, substitua o comando pip install por:
pip install -e .
Siga as etapas acima, mas primeiro certifique-se de ter as bibliotecas corretas:
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
Opções comuns:
-V, --python-version
: versão Python (major.minor) do código de destino. O padrão é a versão em que o pytype está sendo executado.-o, --output
: o diretório para o qual vai toda a saída do pytype, incluindo os arquivos .pyi gerados. O padrão é .pytype
.-d, --disable
. Lista separada por vírgula ou espaço de nomes de erros a serem ignorados. Explicações detalhadas dos nomes dos erros do pytype estão neste documento. O padrão é vazio. Para obter uma lista completa de opções, execute pytype --help
.
Além do acima, você pode direcionar o pytype para usar uma instalação digitada personalizada em vez de sua própria cópia agrupada, definindo $TYPESHED_HOME
.
Por conveniência, você pode salvar sua configuração do pytype em um arquivo. O arquivo de configuração pode ser um arquivo estilo TOML com uma seção [tool.pytype]
(preferencial) ou um arquivo estilo INI com uma seção [pytype]
. Se um arquivo de configuração explícito não for fornecido, o pytype procurará uma seção pytype no primeiro arquivo pyproject.toml
ou setup.cfg
encontrado caminhando para cima a partir do diretório de trabalho atual.
Comece gerando um arquivo de configuração de amostra:
$ pytype --generate-config pytype.toml
Agora personalize o arquivo com base na sua configuração local, mantendo apenas as seções necessárias. Os diretórios podem ser relativos à localização do arquivo de configuração, o que é útil se você quiser fazer check-in do arquivo de configuração como parte do seu projeto.
Por exemplo, suponha que você tenha a seguinte estrutura de diretórios e queira analisar o pacote ~/repo1/foo
, que depende do pacote ~/repo2/bar
:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
Aqui está o arquivo de configuração preenchido, que instrui o pytype a verificar o tipo ~/repo1/foo
como código Python 3.9, procurar pacotes em ~/repo1
e ~/repo2
e ignorar erros de atributos. Observe que o caminho para um pacote não inclui o pacote em si.
$ 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 ' ,
]
Poderíamos ter descoberto que ~/repo2
precisava ser adicionado ao pythonpath executando o verificador de dependência quebrada do pytype:
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
O Pytype vem com alguns scripts além do próprio pytype
:
annotate-ast
, um anotador de tipo em andamento para ASTs.merge-pyi
, para mesclar informações de tipo de um arquivo .pyi em um arquivo Python.pytd-tool
, um analisador para arquivos .pyi.pytype-single
, uma ferramenta de depuração para desenvolvedores pytype, que analisa um único arquivo Python assumindo que os arquivos .pyi já foram gerados para todas as suas dependências.pyxref
, um gerador de referências cruzadas. Apache 2.0
Este não é um produto oficial do Google.