2016-06-22 11 views
1

注釈を使用してIDEでオートコンプリートを改善し、自動テストでテストをタイプしたいとします。しかし、多くの追加コードを導入することなく、どのように多くのメソッドに型名を追加できますか?パッケージレベルでタイプ注釈を使用する

たとえば、引数を持つ約200個のメソッドを含む、Djangoフレームワークを使用する大きなコードベースがあるとします。型注釈を200回追加すると、コードが膨らんでしまいます。

私の現在のアイデアは、パッケージレベルでsetup.py(または他の場所)にタイプ注釈を含めることです。私は、request変数が使用されるたびにというルールを定義します。タイプはdjango.http.HttpRequest "です。値がrequestの変数が別の型を指すエッジの場合、明示的なアノテーションは実行する必要がありますが、これらのアノテーションはほとんどありません。

これはどのように実装できますか?全体的な目標を達成する他の方法はありますか?デフォルトでは

from django.http import HttpRequest 

class RequireHttpRequest(): 
    def process_view(request, view_func, view_args, view_kwargs): 
     require_http_request = view_kwargs.get('require_http_request', True) 
     if require_http_request and type(h) != HttpRequest: 
      raise SomeException 
     return None 

は、このミドルウェアは、すべてのURLに影響を与える:

答えて

5

私の理解が正しければ、これはPEP 484で説明したように、スタブファイルのためのユースケースのように聞こえる:

スタブファイルは種類によってのみ使用するためのものであるタイプのヒントを含むファイルですチェッカー、実行時ではありません。

スタブファイルは、コードを型のアノテーションから分離して、複雑な型ヒントの浮き沈みの影響を避けるという要件をほぼ満たしています。接頭辞が.pyiであり、IDEで実装されているタイプチェッカーがPEP 484に準拠している場合は、型チェッカーが存在する場合は常に検査する必要があります。

彼らは基本的にあなたがこのことについて行くことができる...


一つの方法は、少なくとも、あなたの.pyiを書き出すためにヘルパー関数を使用して、またはされた単一の省略記号を含む身体の注釈を付け関数のシグネチャで構成されその大部分。おそらくこれを行う方法はたくさんありますが、おそらく最高のものはおそらく別の質問でしょう。

これを行う方法の例として、モジュールのすべての関数に、objectという名前のパラメータがあり、アンダースコアで始まらないすべての関数に注釈を付ける方法を書きます。私はこの特定のモジュールをタイプしています。なぜなら、関数を識別し、その署名を取得するためにも使用するからです。

inspectモジュールからは、getmembersisfunction、およびsignatureの関数を使用します。

このロジックは、method、その他のパラメータタイプなどに拡張することができます。 また、重要な注釈の場合、.pyiファイルには、注釈を付けるモジュールと同じ名前を付ける必要があります。この場合、inspect.pyiである必要があります。

def findsource(object:'object'): ... 
def formatannotationrelativeto(object:'object'): ... 
def getabsfile(object:'object'): ... 
def getcomments(object:'object'): ... 
def getdoc(object:'object'): ... 
def getfile(object:'object'): ... 
def getmembers(object:'object'): ... 
def getmodule(object:'object'): ... 
def getsource(object:'object'): ... 
# .. and so on.. 

最も生産準備チェッカーは、この.pyiファイルを読み込むと機能を提供します:今のところ

が、これは単に私たちが供給「注釈」(object)とobjectという名前のパラメータを持つすべての機能を出力しますあなたが必要です。

+1

この詳細な回答ありがとうございました。あなたは賞金を得る! – guettli

0

カスタムmiddleware(未テスト)を使用することができます。

url(r'^foo/$', views.your_view, require_http_request=False) 

my_view()の定義に具体的な注釈を入れて:あなたは、requestの種類を確認したいurls.pyの対応する行にパラメータを追加しないために、いくつかのURLについて。

+0

私の質問はあまりにも曖昧だったと思います。私はこれを追加しました:私は注釈がIDEでより良い自動補完を持ってほしいです。おそらく(後で)タイプのテストが自動テストで行われます。 – guettli

関連する問題