Pytype prüft und leitet Typen für Ihren Python-Code ab – ohne dass Typanmerkungen erforderlich sind. Pytype kann:
Pytype ist ein statischer Analysator; Der Code, auf dem er ausgeführt wird, wird nicht ausgeführt.
Tausende Projekte bei Google verlassen sich auf Pytype, um ihren Python-Code gut typisiert und fehlerfrei zu halten.
Weitere Informationen finden Sie im Benutzerhandbuch, in den FAQ oder unter den unterstützten Funktionen.
Pytype verwendet Inferenz statt schrittweiser Eingabe. Dies bedeutet, dass Typen aus dem Code abgeleitet werden, selbst wenn der Code keine Typhinweise enthält. So können Probleme mit Code wie diesem erkannt werden, die andere Typprüfer übersehen würden:
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 ist nachsichtig statt streng. Das bedeutet, dass alle Vorgänge zulässig sind, die zur Laufzeit erfolgreich sind und nicht im Widerspruch zu Anmerkungen stehen. Beispielsweise gilt dieser Code in pytype als sicher, schlägt jedoch in anderen Typprüfern fehl, die Variablen Typen zuweisen, sobald sie initialisiert werden:
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"
Siehe auch den entsprechenden FAQ-Eintrag.
Um schnell mit der Typprüfung einer Datei oder eines Verzeichnisses zu beginnen, führen Sie Folgendes aus und ersetzen Sie file_or_directory
durch Ihre Eingabe:
pip install pytype
pytype file_or_directory
Um Pytype für ein gesamtes Paket einzurichten, fügen Sie Folgendes zu einer Datei pyproject.toml
im Verzeichnis direkt über dem Paket hinzu und ersetzen Sie package_name
durch den Paketnamen:
[ tool . pytype ]
inputs = [ ' package_name ' ]
Jetzt können Sie den Befehl „ pytype
ohne Argumente ausführen, um das Paket einer Typprüfung zu unterziehen. Es ist auch einfach, Pytype zu Ihren automatisierten Tests hinzuzufügen. Sehen Sie sich dieses Beispiel eines GitHub-Projekts an, das Pytype auf GitHub Actions ausführt.
Schließlich generiert pytype Dateien mit abgeleiteten Typinformationen, die sich standardmäßig in .pytype/pyi
befinden. Sie können diese Informationen verwenden, um die entsprechende Quelldatei mit Typannotationen zu versehen:
merge-pyi -i < filepath > .py .pytype/pyi/ < filename > .pyi
Sie benötigen einen Python 3.8-3.12-Interpreter, um pytype auszuführen, sowie einen Interpreter in $PATH
für die Python-Version des Codes, den Sie analysieren (unterstützt: 3.8-3.12).
Plattformunterstützung:
* Unter Alpine Linux kann die Installation aufgrund von Problemen mit Upstream-Abhängigkeiten fehlschlagen. Sehen Sie sich die Details zu diesem Problem an, um eine mögliche Lösung zu finden.
** Wenn die Ninja-Abhängigkeit nicht installiert werden kann, stellen Sie sicher, dass cmake installiert ist. Weitere Informationen finden Sie in dieser Ausgabe.
Pytype kann über pip installiert werden. Beachten Sie, dass für die Installation wheel
und setuptools
erforderlich sind. (Wenn Sie in einer virtuellen Umgebung arbeiten, sollten diese beiden Pakete bereits vorhanden sein.)
pip install pytype
Oder aus dem Quellcode auf GitHub.
git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .
Anstatt --recurse-submodules
zu verwenden, hätten Sie auch ausführen können
git submodule init
git submodule update
im pytype
Verzeichnis. Um den Code zu bearbeiten und Ihre Änderungen live verfolgen zu lassen, ersetzen Sie den Befehl „pip install“ durch:
pip install -e .
Befolgen Sie die oben genannten Schritte, stellen Sie jedoch zunächst sicher, dass Sie über die richtigen Bibliotheken verfügen:
sudo apt install build-essential python3-dev libpython3-dev
usage: pytype [options] input [input ...]
positional arguments:
input file or directory to process
Häufige Optionen:
-V, --python-version
: Python-Version (major.minor) des Zielcodes. Standardmäßig wird die Version verwendet, unter der Pytype ausgeführt wird.-o, --output
: Das Verzeichnis, in das die gesamte Pytype-Ausgabe geht, einschließlich der generierten .pyi-Dateien. Standardmäßig ist .pytype
.-d, --disable
. Durch Kommas oder Leerzeichen getrennte Liste der zu ignorierenden Fehlernamen. Detaillierte Erläuterungen zu den Fehlernamen von Pytype finden Sie in diesem Dokument. Standardmäßig ist leer. Für eine vollständige Liste der Optionen führen Sie pytype --help
aus.
Darüber hinaus können Sie pytype anweisen, eine benutzerdefinierte Typeshed-Installation anstelle der eigenen gebündelten Kopie zu verwenden, indem Sie $TYPESHED_HOME
festlegen.
Der Einfachheit halber können Sie Ihre Pytype-Konfiguration in einer Datei speichern. Die Konfigurationsdatei kann eine Datei im TOML-Stil mit einem Abschnitt [tool.pytype]
(bevorzugt) oder eine Datei im INI-Stil mit einem Abschnitt [pytype]
sein. Wenn keine explizite Konfigurationsdatei angegeben wird, sucht pytype nach einem pytype-Abschnitt in der ersten pyproject.toml
oder setup.cfg
Datei, die beim Aufwärtsgehen vom aktuellen Arbeitsverzeichnis gefunden wird.
Beginnen Sie mit der Generierung einer Beispielkonfigurationsdatei:
$ pytype --generate-config pytype.toml
Passen Sie nun die Datei basierend auf Ihrem lokalen Setup an und behalten Sie nur die Abschnitte bei, die Sie benötigen. Verzeichnisse können relativ zum Speicherort der Konfigurationsdatei sein, was nützlich ist, wenn Sie die Konfigurationsdatei als Teil Ihres Projekts einchecken möchten.
Angenommen, Sie haben die folgende Verzeichnisstruktur und möchten das Paket ~/repo1/foo
analysieren, das vom Paket ~/repo2/bar
abhängt:
~/
├── repo1
│ └── foo
│ ├── __init__.py
│ └── file_to_check.py
└── repo2
└── bar
├── __init__.py
└── dependency.py
Hier ist die ausgefüllte Konfigurationsdatei, die pytype anweist, ~/repo1/foo
als Python 3.9-Code einer Typprüfung zu unterziehen, nach Paketen in ~/repo1
und ~/repo2
zu suchen und Attributfehler zu ignorieren. Beachten Sie, dass der Pfad zu einem Paket nicht das Paket selbst enthält.
$ 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 ' ,
]
Wir hätten herausfinden können, dass ~/repo2
zum Python-Pfad hinzugefügt werden musste, indem wir den defekten Abhängigkeitsprüfer von pytype ausgeführt haben:
$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved
Unresolved dependencies:
bar.dependency
Pytype wird zusätzlich zu pytype
selbst mit einigen Skripten ausgeliefert:
annotate-ast
, ein in Bearbeitung befindlicher Annotator für ASTs.merge-pyi
zum Zusammenführen von Typinformationen aus einer .pyi-Datei in eine Python-Datei.pytd-tool
, ein Parser für .pyi-Dateien.pytype-single
, ein Debugging-Tool für Pytype-Entwickler, das eine einzelne Python-Datei unter der Annahme analysiert, dass bereits .pyi-Dateien für alle ihre Abhängigkeiten generiert wurden.pyxref
, ein Querverweisgenerator. Apache 2.0
Dies ist kein offizielles Google-Produkt.