2017-11-17 10 views
0

Python 3では、タイプヒントを使用すると、mypyなどのサードパーティのツールでタイプを確認できます。しかし、私はプログラムのコメントと一緒に少し醜いタイプチェック構文を見つける。 mypyでは、スタブ関数とメソッドを.pyファイルと同じディレクトリにある別のファイル.pyiに入れることができます。 .pyファイルの.pyiファイルにすべてのタイプ関連の構文を定義できますか?例えば、.pyiファイルで、すべての型構文を使用して変数、メソッド、戻り値の型などを定義できますが、コードは.pyのままにしておきます。Pythonのすべてのタイプヒント/検査インフラストラクチャを.pyiファイルに分けることは可能ですか?

答えて

1

PEP 484では、コードのユーザーのために既存のモジュールの「パブリックインターフェイス」として機能するカスタムpyiファイルを作成できると指定していますが、これらのpyiファイルを取得する方法は指定されておらず、内部的には、対応するpyファイルをtypecheckします。

実際、ディレクトリにpyとpyiファイルの両方が含まれている場合、pyファイルは完全に無視されます。

これはmypy issue trackerで公開されていますが、その機能が実装されていてもPythonのタイプのサブセットのみを使用できるため、私には優先度の低いタスクのようですシステム。

例えば、我々はテンプレートHTMLまたは何かのためにいくつかのコードを書くことNewTypeのようなものを使用したいとします

from pathlib import Path 
from typing import NewType 

UnsanitizedText = NewType('UnsanitizedText', str) 
CleanHtml = NewType('CleanHtml', str) 
HtmlTemplate = NewType('HtmlTemplate', str) 

def get_user_input() -> UnsanitizedText: 
    # code omitted 

def escape_to_html(raw: UnsanitizedText) -> CleanHtml: 
    # perform checks on 'raw', do escaping logic, etc 
    return CleanHtml(cleaned_string) 

def load_template(path: Path) -> HtmlTemplate: 
    return HtmlTemplate(path.read_text()) 

def render_template(template: HtmlTemplate, *kwargs: CleanHtml) -> CleanHtml: 
    # code omitted 

t = load_template(Path("foo/bar.html")) 
dirty = get_user_input() 
clean = escape_to_html(dirty) 

print(render_template(t, arg=dirty)) # Does not typecheck 
print(render_template(t, arg=clean)) # Typechecks 

我々は実際に我々が構築ファントムnewtypesを呼び出す必要がないので/これらを混在して付き合うことができますファントムが正規表現内で呼び出すと、このモジュールをスタブとしてどのように表現するのかは不明です。

もスタブで表現するのは困難であろう他のいくつかのタイピングの機能があります - キャストのようなもの、NamedTuple、TypedDictなど

+0

おかげで。 Python 3.6より前に変数型を指定するためのコメントを使用する必要性や、複合型データ型を受け取ったり返す関数では構文があまりにも視覚的にぎこちなすぎるのです。多分私はそれを将来再訪するでしょう。 – Sean

関連する問題