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:
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;
}
}
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0482.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT