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

Python 개선 제안 한국어 번역

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입니다.

파이썬을 위한 기존 접근법

mypy

(이 절은 초안 상태입니다. mypy가 본질적으로 우리가 제안하는 것이기 때문입니다.)

Reticulated Python

Michael Vitousek의 Reticulated Python은 파이썬을 위한 점진적 타이핑에 대한 약간 다른 접근법의 예입니다. 이는 Vitousek이 Jeremy Siek, Jim Baker(후자는 Jython으로 유명함)와 함께 작성한 실제 academic paper에서 설명됩니다.

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 스타일 문법을 가진 클래스 기반의 단일 상속 객체 지향 언어입니다. 이는 인터페이스, 추상 클래스, 구체화된 제네릭, 선택적 타이핑을 지원합니다.

가능한 경우 타입이 추론됩니다. 런타임은 두 가지 실행 모드, 즉 개발을 위해 설계되어 런타임에 타입 오류를 잡아내는 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의 상위 집합입니다.

타입 검사는 덕 타이핑으로 이루어집니다. 유효한 여러 함수 시그니처는 오버로드된 함수 선언을 제공하여 지정합니다. 함수와 클래스는 타입 매개변수화를 위해 제네릭을 사용할 수 있습니다. 인터페이스는 선택적 필드를 가질 수 있습니다. 인터페이스는 배열 타입과 딕셔너리 타입을 지정할 수 있습니다. 클래스는 인자를 필드로 암묵적으로 추가하는 생성자를 가질 수 있습니다. 클래스는 정적 필드를 가질 수 있습니다. 클래스는 비공개 필드를 가질 수 있습니다. 클래스는 필드에 대한 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;
    }
}