web-dev-qa-db-ja.com

静的型チェックイン用のツールPython

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

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

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

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

[〜#〜]編集[〜#〜]:例:

_def put(d, k, v):
   d[k] = v
_

put関数にタイプput<K,V>(dict<K,V>, K, V) -> Noneを持つものとして注釈を付けられるようにしたいと思います。

[〜#〜] update [〜#〜]:新しい PEP 484 (2014年9月) Python 3.5+で静的型付けと型注釈の標準を定義します。PEP484と互換性のある mypy と呼ばれる型チェックツールがあります。

39
Kannan Goundan

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

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


元の投稿:

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

要約すれば:

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

2011-05-17を編集:

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

  • Pythonの型推論 の議論。 (他のリンクはここからです。)
  • オプションの静的型付けの追加に関するGuidovan van Rossumの記事: パート1 および パート2
  • RPython 、Pythonのサブセットであり、何らかの形の型チェックを行うのに十分な静的分析が行われる可能性があります。
16
Karmastan

mypy おもしろいと思うかもしれません。 Python 3.5 by Guido に含めるよう提案されています。

9
kirbyfan64sos

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

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

  • オープンソースJava(Jythonインデクサー)
  • クローズドソースJava(Googleに非表示)
  • オープンソースPython( mini-pysonar

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

6
Vanuan

これが役立つかどうかはわかりませんが、その価値については、コロラド州のUのJeremy Siekが段階的な型指定の作業を行い、これをすばやく検索していることがわかりました。 http://www.wiki.jvmlangsummit.com/pdf/28_Siek_gradual.pdf

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

あなたの最善の策は、作者に連絡して、彼らがあなたに彼らのコードをリリースできるかどうか尋ねることかもしれません。

3
Russell

Python 3; [〜#〜] pip [〜#〜] または Bitbucket Repo を参照)の「段階的」パッケージがあります

どうやらこれは Jeremy Siek の周りのグループによる実装であり、段階的なタイピングの分野ではかなりの権威のようです。

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

from gradual import *

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

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

2
Paul

prospectorlandscape.io のバックエンドが好きです。これは、pylint、pyflakes、pep8、frosted ...などの既存のアナライザーの出力を1つのレポートにまとめたものです。きちんとした。

2
Tomas Tomecek

私はしばらく前に同様の必要性を持っていました。私が見つけた既存のソリューションはすべて、問題があったか、必要な機能がないため、独自に作成しました。

使用方法は次のとおりです。

from requiretype import require

@require(name=str, age=(int, float, long))
def greet_person(name, age):
    print "Hello {0} ({1})".format(name, age)

>>> greet_person("John", 42)
Hello John (42)

>>> greet_person("John", "Doe")
# [...traceback...]
TypeError: Doe is not a valid type.
Valid types: <type 'int'>, <type 'float'>, <type 'long'>

>>> greet_person(42, 43)
# [...traceback...]
TypeError: 42 is not a <type 'str'> type

これがお役に立てば幸いです。

詳細については、以下をご覧ください。

追伸:(githubリポジトリから自分自身を引用)

ほとんどの場合、Pythonで行う方が自然なので、型チェックの代わりにテストを使用することをお勧めします。ただし、使用する特定のタイプを指定する必要がある場合があります。pythonにはパラメーターのタイプチェックがないため、これが役立つ場合があります。

1
ivanalejandro0