40

私は大規模な既存の Python コードベースを使用しており、型注釈の追加を開始して、ある程度の静的チェックを取得できるようにしたいと考えています。ErlangStrongtalk、またはTyped Scheme/Racketのようなものを想像しています。

関数パラメーターに基づいて動的チェックを挿入し、型の注釈を返す、簡単で汚いデコレーターを見てきましたが、より堅牢で、コンパイル時にチェックを実行するものを探しています。

この種のことのために、現在どのようなツールが利用可能ですか? 私はコンパイラと型チェックに精通しており、基礎がしっかりしていれば、不完全なツールを改善したいと思っています。

(注: 静的型付けの長所/短所の議論には興味がありません。)

編集:例:

def put(d, k, v):
   d[k] = v

put関数に typeという注釈を付けたいと思いput<K,V>(dict<K,V>, K, V) -> Noneます。

UPDATE : 新しいPEP 484 (2014 年 9 月) は、Python 3.5+ の静的型付けと型注釈の標準を定義します。PEP 484 と互換性のあるmypyという型チェック ツールがあります。

4

7 に答える 7

17

編集 2016-11-11: mypyを使用してください。型ヒントは徐々に追加できます。Python 3 ソース コードでは、標準のPEP 484型ヒントを検証します。Python 2 でも、特別なコメントを使用して型を表現できます。グイドはそれが好きです。

この投稿は、mypy が登場するずっと前に書かれたものです。正確ではありませんが、投稿の元のコンテンツを以下に保存しました。


元の投稿:

Python の静的解析に関するこの関連する StackOverflow の投稿で言及されているプロジェクトのいくつかを確認することをお勧めします。

要約すれば:

Python はダックタイピングを広範囲に使用するため、他の言語で「型エラー」と呼ばれるものは、Python では「オブジェクトXはメソッドYをサポートしていません」になる可能性があります。

2011-05-17 を編集:

Python では静的型付けが不可能であるという delnan に同意します[明らかに間違っています]。しかし、私たちの懐疑論はあなたを思いとどまらせるようには見えないので、私はあなたにこの件に関するより多くの情報を提供することしかできません. 私は提示します:

  • Python の型推論に関する議論。(その他のリンクはこちらから)
  • オプションの静的型付けの追加に関する Guido van van Rossum の記事:パート 1およびパート 2
  • RPythonは、何らかの形式の型チェックを実行するのに十分なほど静的に分析される可能性がある Python のサブセットです。
于 2011-05-17T02:50:27.440 に答える
6

この投稿をチェックしてください: PySonar: a Static Analyzer for Python . PySonar は、コードの抽象的な解釈 (部分的に実行) を使用して型を推測するツールです。プログラムのすべての可能な実行パスを見つけ、すべての変数のすべての可能なタイプを見つけます。

PySonar には基本的に 3 つのバージョンがあります。

  • オープンソースの Java (Jython インデクサー)
  • クローズドソースの Java (Google に隠されています)
  • オープンソースの Python ( mini-pysonar )

それらのどれも (クローズド ソースのものを除いて) 完全に実装されていません。しかし、基本的な考え方は、それを自分の仕事の基礎として使用できるということです。

于 2013-07-01T09:39:09.000 に答える
3

これが役立つかどうかはわかりませんが、コロラド大学の Jeremy Siek が段階的なタイピングに関する作業を行いました。 http://www.wiki.jvmlangsummit.com/pdf/28_Siek_gradual.pdf

私の推測では (私が間違っているかもしれません)、彼の研究は比較的新しいように見えるため、現時点で見つけることができる有望なオープン ソース ツールはありません。

最善の策は、作成者に連絡して、彼らのコードをリリースできるかどうか尋ねることです。

于 2011-06-15T18:05:23.127 に答える
2

私は、 landscape.ioのバックエンドである prostor が好きです。pylint、pyflakes、pep8、frosted などの既存のアナライザーの出力を 1 つのレポートに結合します。きちんとした。

于 2014-08-26T14:21:35.893 に答える
2

Python 3 用の「漸進的な」パッケージがあります。PIPまたはBitbucket Repoを参照してください

どうやらこれは、段階的な型付けの分野でかなりの権威であると思われるJeremy Siekの周りのグループによる実装です。

明らかにいくつかの注釈が必要です。以下に例を示します。

from gradual import *

@typed
def calculate_total(a:int, b:int) -> int:
    return a + b//100

注釈に関する限り、これはそれほど悪くはありません。私はこのパッケージを使用したことがないので、その品質について話すことはできませんが、構文 (およびその背後にいる人々) は確かに有望に見えます。

于 2013-11-13T07:27:17.193 に答える