2015-01-08 14:10:25 -05:00
|
|
|
|
PEP: 482
|
2015-01-16 12:11:05 -05:00
|
|
|
|
Title: Literature Overview for Type Hints
|
2015-01-08 14:10:25 -05:00
|
|
|
|
Version: $Revision$
|
|
|
|
|
Last-Modified: $Date$
|
|
|
|
|
Author: Łukasz Langa <lukasz@langa.pl>
|
|
|
|
|
Discussions-To: Python-Ideas <python-ideas@python.org>
|
|
|
|
|
Status: Draft
|
|
|
|
|
Type: Informational
|
|
|
|
|
Content-Type: text/x-rst
|
|
|
|
|
Created: 08-Jan-2015
|
|
|
|
|
Post-History:
|
|
|
|
|
Resolution:
|
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
|
========
|
|
|
|
|
|
|
|
|
|
This PEP is one of three related to type hinting. This PEP gives a
|
2015-01-16 12:11:05 -05:00
|
|
|
|
literature overview of related work. The main spec is PEP 484.
|
2015-01-08 14:10:25 -05:00
|
|
|
|
|
|
|
|
|
|
2015-01-09 13:52:06 -05:00
|
|
|
|
Existing Approaches for Python
|
|
|
|
|
==============================
|
|
|
|
|
|
2015-01-08 14:10:25 -05:00
|
|
|
|
|
|
|
|
|
mypy
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
(This section is a stub, since mypy [mypy]_ is essentially what we're
|
|
|
|
|
proposing.)
|
|
|
|
|
|
2015-01-09 13:52:06 -05:00
|
|
|
|
|
|
|
|
|
Reticulated Python
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
Reticulated Python [reticulated]_ by Michael Vitousek is an example of
|
|
|
|
|
a slightly different approach to gradual typing for Python. It is
|
|
|
|
|
described in an actual academic paper [reticulated-paper]_ written by
|
|
|
|
|
Vitousek with Jeremy Siek and Jim Baker (the latter of Jython fame).
|
|
|
|
|
|
|
|
|
|
|
2015-01-09 18:21:14 -05:00
|
|
|
|
PyCharm
|
|
|
|
|
-------
|
|
|
|
|
|
|
|
|
|
PyCharm by JetBrains has been providing a way to specify and check
|
|
|
|
|
types for about four years. The type system suggested by PyCharm
|
|
|
|
|
[pycharm]_ grew from simple class types to tuple types, generic types,
|
|
|
|
|
function types, etc. based on feedback of many users who shared their
|
|
|
|
|
experience of using type hints in their code.
|
|
|
|
|
|
|
|
|
|
|
2015-01-09 13:52:06 -05:00
|
|
|
|
Others
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
TBD: Add sections on pyflakes [pyflakes]_, pylint [pylint]_, numpy
|
|
|
|
|
[numpy]_, Argument Clinic [argumentclinic]_, pytypedecl [pytypedecl]_,
|
|
|
|
|
numba [numba]_, obiwan [obiwan]_.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Existing Approaches in Other Languages
|
|
|
|
|
======================================
|
|
|
|
|
|
2015-01-08 14:10:25 -05:00
|
|
|
|
ActionScript
|
|
|
|
|
------------
|
|
|
|
|
|
|
|
|
|
ActionScript [actionscript]_ is a class-based, single inheritance,
|
|
|
|
|
object-oriented superset of ECMAScript. It supports inferfaces and
|
|
|
|
|
strong runtime-checked static typing. Compilation supports a “strict
|
|
|
|
|
dialect” where type mismatches are reported at compile-time.
|
|
|
|
|
|
|
|
|
|
Example code with types::
|
|
|
|
|
|
|
|
|
|
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 [dart]_ is a class-based, single inheritance, object-oriented
|
|
|
|
|
language with C-style syntax. It supports interfaces, abstract classes,
|
|
|
|
|
reified generics, and optional typing.
|
|
|
|
|
|
|
|
|
|
Types are inferred when possible. The runtime differentiates between two
|
|
|
|
|
modes of execution: *checked mode* aimed for development (catching type
|
|
|
|
|
errors at runtime) and *production mode* recommended for speed execution
|
|
|
|
|
(ignoring types and asserts).
|
|
|
|
|
|
|
|
|
|
Example code with types::
|
|
|
|
|
|
|
|
|
|
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 [hack]_ is a programming language that interoperates seamlessly
|
|
|
|
|
with PHP. It provides opt-in static type checking, type aliasing,
|
|
|
|
|
generics, nullable types, and lambdas.
|
|
|
|
|
|
|
|
|
|
Example code with types::
|
|
|
|
|
|
|
|
|
|
<?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 [typescript]_ is a typed superset of JavaScript that adds
|
|
|
|
|
interfaces, classes, mixins and modules to the language.
|
|
|
|
|
|
|
|
|
|
Type checks are duck typed. Multiple valid function signatures are
|
|
|
|
|
specified by supplying overloaded function declarations. Functions and
|
|
|
|
|
classes can use generics as type parametrization. Interfaces can have
|
|
|
|
|
optional fields. Interfaces can specify array and dictionary types.
|
|
|
|
|
Classes can have constructors that implicitly add arguments as fields.
|
|
|
|
|
Classes can have static fields. Classes can have private fields.
|
|
|
|
|
Classes can have getters/setters for fields (like property). Types are
|
|
|
|
|
inferred.
|
|
|
|
|
|
|
|
|
|
Example code with types::
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
References
|
|
|
|
|
==========
|
|
|
|
|
|
|
|
|
|
.. [mypy]
|
|
|
|
|
http://mypy-lang.org
|
|
|
|
|
|
2015-01-09 13:52:06 -05:00
|
|
|
|
.. [reticulated]
|
|
|
|
|
https://github.com/mvitousek/reticulated
|
|
|
|
|
|
|
|
|
|
.. [reticulated-paper]
|
|
|
|
|
http://wphomes.soic.indiana.edu/jsiek/files/2014/03/retic-python.pdf
|
|
|
|
|
|
2015-01-09 18:21:14 -05:00
|
|
|
|
.. [pycharm]
|
|
|
|
|
https://github.com/JetBrains/python-skeletons#types
|
|
|
|
|
|
2015-01-08 14:10:25 -05:00
|
|
|
|
.. [obiwan]
|
|
|
|
|
http://pypi.python.org/pypi/obiwan
|
|
|
|
|
|
|
|
|
|
.. [numba]
|
|
|
|
|
http://numba.pydata.org
|
|
|
|
|
|
|
|
|
|
.. [pytypedecl]
|
|
|
|
|
https://github.com/google/pytypedecl
|
|
|
|
|
|
|
|
|
|
.. [argumentclinic]
|
|
|
|
|
https://docs.python.org/3/howto/clinic.html
|
|
|
|
|
|
|
|
|
|
.. [numpy]
|
|
|
|
|
http://www.numpy.org
|
|
|
|
|
|
|
|
|
|
.. [typescript]
|
|
|
|
|
http://www.typescriptlang.org
|
|
|
|
|
|
|
|
|
|
.. [hack]
|
|
|
|
|
http://hacklang.org
|
|
|
|
|
|
|
|
|
|
.. [dart]
|
|
|
|
|
https://www.dartlang.org
|
|
|
|
|
|
|
|
|
|
.. [actionscript]
|
|
|
|
|
http://livedocs.adobe.com/specs/actionscript/3/
|
|
|
|
|
|
|
|
|
|
.. [pyflakes]
|
|
|
|
|
https://github.com/pyflakes/pyflakes/
|
|
|
|
|
|
|
|
|
|
.. [pylint]
|
|
|
|
|
http://www.pylint.org
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
=========
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
..
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
sentence-end-double-space: t
|
|
|
|
|
fill-column: 70
|
|
|
|
|
coding: utf-8
|
|
|
|
|
End:
|