Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 482 – Literaturübersicht für Typ-Annotationen

Autor:
Łukasz Langa <lukasz at python.org>
Discussions-To:
Python-Ideas Liste
Status:
Final
Typ:
Informational
Thema:
Typisierung
Erstellt:
08-Jan-2015
Post-History:


Inhaltsverzeichnis

Zusammenfassung

Diese PEP ist eine von drei, die sich mit Typ-Annotationen befassen. Diese PEP gibt eine Literaturübersicht über verwandte Arbeiten. Die Hauptspezifikation ist PEP 484.

Bestehende Ansätze für Python

mypy

(Dieser Abschnitt ist ein Platzhalter, da mypy im Wesentlichen das ist, was wir vorschlagen.)

Reticulated Python

Reticulated Python von Michael Vitousek ist ein Beispiel für einen leicht anderen Ansatz für schrittweises Typisieren für Python. Es wird in einer tatsächlichen wissenschaftlichen Arbeit beschrieben, die von Vitousek mit Jeremy Siek und Jim Baker (letzterer bekannt von Jython) verfasst wurde.

PyCharm

PyCharm von JetBrains bietet seit etwa vier Jahren eine Möglichkeit, Typen anzugeben und zu überprüfen. Das von PyCharm vorgeschlagene Typsystem entwickelte sich von einfachen Klassentypen zu Tupeltypen, generischen Typen, Funktionstypen usw. basierend auf dem Feedback vieler Benutzer, die ihre Erfahrungen mit der Verwendung von Typ-Annotationen in ihrem Code teilten.

Andere

TBD: Hinzufügen von Abschnitten zu pyflakes, pylint, numpy, Argument Clinic, pytypedecl, numba, obiwan.

Bestehende Ansätze in anderen Sprachen

ActionScript

ActionScript ist eine klassenbasierte, objektorientierte Obermenge von ECMAScript mit einfacher Vererbung. Es unterstützt Schnittstellen und stark laufzeitgeprüfte statische Typisierung. Die Kompilierung unterstützt einen "strengen Dialekt", bei dem Typfehlanpassungen zur Kompilierzeit gemeldet werden.

Beispielcode mit Typen

package {
  import flash.events.Event;

  public class BounceEvent extends Event {
    public static const BOUNCE:String = "bounce";
    private var _side:String = "none";

    public function get side():String {
      return _side;
    }

    public function BounceEvent(type:String, side:String){
      super(type, true);
      _side = side;
    }

    public override function clone():Event {
      return new BounceEvent(type, _side);
    }
  }
}

Dart

Dart ist eine klassenbasierte, objektorientierte Sprache mit einfacher Vererbung und C-ähnlicher Syntax. Sie unterstützt Schnittstellen, abstrakte Klassen, reified Generics und optionale Typisierung.

Typen werden, wenn möglich, abgeleitet. Die Laufzeit unterscheidet zwischen zwei Ausführungsmodi: dem checked mode für die Entwicklung (Erkennung von Typfehlern zur Laufzeit) und dem production mode, der für schnelle Ausführung empfohlen wird (Ignorieren von Typen und Assertions).

Beispielcode mit Typen

class Point {
    final num x, y;

    Point(this.x, this.y);

    num distanceTo(Point other) {
        var dx = x - other.x;
        var dy = y - other.y;
        return math.sqrt(dx * dx + dy * dy);
    }
}

Hack

Hack ist eine Programmiersprache, die nahtlos mit PHP interoperiert. Sie bietet opt-in statische Typprüfung, Typ-Aliasing, Generics, nullable Typen und Lambdas.

Beispielcode mit Typen

<?hh
class MyClass {
  private ?string $x = null;

  public function alpha(): int {
    return 1;
  }

  public function beta(): string {
    return 'hi test';
  }
}

function f(MyClass $my_inst): string {
  // Will generate a hh_client error
  return $my_inst->alpha();
}

TypeScript

TypeScript ist eine typisierte Obermenge von JavaScript, die Schnittstellen, Klassen, Mixins und Module zur Sprache hinzufügt.

Typprüfungen sind duck-typed. Mehrere gültige Funktionssignaturen werden durch Angabe überladener Funktionsdeklarationen festgelegt. Funktionen und Klassen können Generics als Typ-Parametrisierung verwenden. Schnittstellen können optionale Felder haben. Schnittstellen können Array- und Dictionary-Typen angeben. Klassen können Konstruktoren haben, die Argumente implizit als Felder hinzufügen. Klassen können statische Felder haben. Klassen können private Felder haben. Klassen können Getter/Setter für Felder haben (ähnlich wie Eigenschaften). Typen werden abgeleitet.

Beispielcode mit Typen

interface Drivable {
    start(): void;
    drive(distance: number): boolean;
    getPosition(): number;
}

class Car implements Drivable {
    private _isRunning: boolean;
    private _distanceFromStart: number;

    constructor() {
        this._isRunning = false;
        this._distanceFromStart = 0;
    }

    public start() {
        this._isRunning = true;
    }

    public drive(distance: number): boolean {
        if (this._isRunning) {
            this._distanceFromStart += distance;
            return true;
        }
        return false;
    }

    public getPosition(): number {
        return this._distanceFromStart;
    }
}

Quelle: https://github.com/python/peps/blob/main/peps/pep-0482.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT