PyDev Type Inference

Aus Eclipse
Wechseln zu: Navigation, Suche

Einleitung

Python ist eine dynamisch typisierte Sprache. Insbesondere

  • ist der Typ einer Variablen erst zur Laufzeit bekannt und
  • wird der Typ einer Variablen nicht explizit angegeben.

Um zur Bearbeitungszeit (also in Eclipse) den Typ zu bestimmen und beispielsweise die möglichen Methoden für Code-Vervollständigung oder die von einer Methoden-Umbenennung betroffenen Ausdrücke zu ermitteln, muss daher der Typ beziehungsweise die möglichen Typen durch Analyse des Kontrollflusses anhand des Quelltextes ermittelt werden. In Python kommt hinzu, dass Instanzvariable nicht deklariert, sondern durch Zuweisung erzeugt werden. Um beispielsweise eine Liste von Instanzvariablen zu erhalten, muss daher ebenfalls der Kontrollfluss analysiert werden.

Die Technik, um den Typ von Variablen zu bestimmen, wird Type Inference genannt.

Eine vollständige und korrekte Bestimmung ist nicht in jedem Fall möglich:

import math
class X:
    def __init__(self, x):
        self.list = []
        if x == math.pi:
            self.fun = math.sqrt
x1 = X(math.pi)
print x1.fun(4) # gibt '2.0' aus
 
x2 = X(0)
print x2.fun(4) # wirft AttributeError

Hier hat die Instanz von X je nach Konstruktor-Parameter unterschiedlich viele Instanz-Variable. Dieser seltsame Code ist auch für den Programmierer nicht sehr übersichtlich und deshalb ist es in diesem Fall nicht schlimm, dass die IDE nicht erkennt, dass x2 kein Attribut fun hat.

Type Inference in PyDev

Type Inference ist in vielen Fällen nützlich[1]:

Code-Vervollständigung
Wenn bekannt ist, welchen Typ die gerade eingegebene Variable hat, kann eine Liste von Attributen zur Vervollständigung angegeben werden
Navigation
Ist der Typ der Variablen unter dem Cursor bekannt, kann eine Funktion angeboten werden, um zur entsprechenden Klasse oder Methode zu navigieren.
Referenzen
Wenn es beispielsweise mehrere verschiedene Klassen mit dem gleichen Methoden-Namen gibt wird Type Inference benötigt um eine Liste zu erstellen, wo eine dieser Methoden benutzt wird.
Umbenennung
Analog zu den Referenzen ist eine Umbenennung von Methoden/Attributen nur möglich, wenn bei jedem Zugriff bekannt ist, zu welchem Typ das Attribut gehört.

Ziel der Type Inference ist nicht nur, einen korrekten Typ zu finden — object wäre immer korrekt[2] — sondern auch, dass dieser Typ möglichst spezifisch ist, denn nur dann ist das Ergebnis der Type Inference in der IDE auch nützlich.

Soweit ich feststellen kann, ist die in [1] beschriebene Implementierung einer Type Inferers für PyDev in PyDev 1.5.7 nicht vorhanden.

Quellen

  1. 1,0 1,1 http://peptic.ifs.hsr.ch/doc/document.pdf Kap. 5
  2. Fast immer? Sind Zahlen-Literale auch abgeleitet von object? Es wäre jedenfalls kein großes Problem, diese zu erkennen.