PEP 482 – 타입 힌트에 관한 문헌 개관
- Author:
- Łukasz Langa <lukasz at python.org>
- Discussions-To:
- Python-Ideas list
- Status:
- Final
- Type:
- Informational
- Topic:
- Typing
- Created:
- 08-Jan-2015
- Post-History:
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 타입 힌트와 관련된 세 PEP 중 하나입니다. 이 PEP는 관련 연구에 대한 문헌 개관을 제공합니다. 주 명세는 PEP 484입니다.
Python의 기존 접근 방식
mypy
(mypy는 본질적으로 우리가 제안하는 것과 같으므로 이 절은 내용을 채우지 않은 채로 두었습니다.)
Reticulated Python
Michael Vitousek의 Reticulated Python은 파이썬의 점진적 타이핑에 대해 약간 다른 접근 방식을 취하는 예입니다. 이 접근 방식은 Vitousek이 Jeremy Siek, Jim Baker(Jython으로 유명한 인물)와 함께 쓴 실제 학술 논문에 설명되어 있습니다.
PyCharm
JetBrains의 PyCharm은 약 4년 동안 타입을 지정하고 검사하는 방법을 제공해 왔습니다. PyCharm이 제안하는 타입 시스템은 자신의 코드에서 타입 힌트를 사용한 경험을 공유한 많은 사용자의 피드백을 바탕으로 단순한 클래스 타입에서 튜플 타입, 제네릭 타입, 함수 타입 등으로 발전했습니다.
기타
TBD: pyflakes, pylint, numpy, Argument Clinic, pytypedecl, numba, obiwan에 관한 절을 추가해야 합니다.
다른 언어의 기존 접근 방식
ActionScript
ActionScript는 클래스 기반의 단일 상속 객체 지향 언어로, ECMAScript의 상위 집합입니다. 인터페이스와 런타임에 검사되는 강력한 정적 타이핑을 지원합니다. 컴파일할 때는 타입 불일치를 컴파일 타임에 보고하는 “엄격한 방언(strict dialect)”을 사용할 수 있습니다.
타입을 사용한 예제 코드:
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는 C 스타일 문법을 사용하는 클래스 기반의 단일 상속 객체 지향 언어입니다. 인터페이스, 추상 클래스, 실체화된 제네릭(reified generics), 선택적 타이핑을 지원합니다.
가능한 경우 타입이 추론됩니다. 런타임은 두 가지 실행 모드를 구분합니다. 즉 개발용으로 설계되어 런타임에 타입 오류를 잡아내는 checked mode와, 빠른 실행을 위해 권장되며 타입과 assert를 무시하는 production mode입니다.
타입을 사용한 예제 코드:
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은 PHP와 매끄럽게 상호 운용되는 프로그래밍 언어입니다. 옵트인 방식의 정적 타입 검사, 타입 별칭, 제네릭, nullable 타입, 람다를 제공합니다.
타입을 사용한 예제 코드:
<?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는 인터페이스, 클래스, 믹스인, 모듈을 언어에 추가한, 타입이 있는 JavaScript의 상위 집합입니다.
타입 검사는 덕 타이핑 방식으로 이루어집니다. 오버로드된 함수 선언을 제공하여 유효한 함수 시그니처를 여러 개 지정합니다. 함수와 클래스는 타입 매개변수화 수단으로 제네릭을 사용할 수 있습니다. 인터페이스는 선택적 필드를 가질 수 있습니다. 인터페이스는 배열 타입과 딕셔너리 타입을 지정할 수 있습니다. 클래스는 인자를 암묵적으로 필드로 추가하는 생성자를 가질 수 있습니다. 클래스는 정적 필드를 가질 수 있습니다. 클래스는 private 필드를 가질 수 있습니다. 클래스는 필드에 대한 getter/setter를 가질 수 있습니다(property와 유사). 타입이 추론됩니다.
타입을 사용한 예제 코드:
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;
}
}
Copyright
This document has been placed in the public domain.