2017-06-26 9 views
1

私はPythonソースコードをいくつか持っており、変数の型を探したいと思っています。例えば、文字列が与えられた場合ライブラリとしてMyPyを使用してPython式で型を取得する

""" 
greeting = "Hello" 
""" 

私はget_type('greeting') == strを持っています。またはより複雑な例:擬似コードで

""" 
def test(input: str): 
    output = len(input) 
    return str 
""" 

、私のような何かをできるようにしたい:

これは、Python 3での型注釈とMyPyで可能である必要がありそうです
>>> m = parse_module() 
>>> m.functions['test'].locals['output'].get_type() 
int 

が、私方法を理解することはできません。 VSコードのようなIDEは、Pythonコードの型を推測する上で非常に優れています。そのため、これを行うための公開された方法があるはずです。

MyPyでも使用されているモジュールtyped-astがあるようですが、そこに私の道があります。しかし、これは型推論も伝播もしません。私が理解する限り、明示的な注釈を与えます。 MyPyをapiとして使用しますが、チェッカーを実行するだけで、コマンドラインツールと同じエラーメッセージが返されます。私はMyPyに「手を伸ばす」方法を模索しており、推測された情報をいくつか取り上げています。

+0

'inspect'モジュールを使用することができます。 Pythonのイントロスペクションヘルパーです。 –

+0

あなたは 'type()'関数を使うだけでは困惑しますか? – Joe

+0

私はコードを文字列として持っており、実行したくありません。私は、ソースコードに含まれる変数の種類を取得したい。 – jdm

答えて

2

現在、Mypyには非常にプリミティブなベアボーンAPIがあります。このAPIは、ソースコード内で「文書化」されています(https://github.com/python/mypy/blob/master/mypy/api.py)。それを使用するには、基本的には後でクリーンアップする一時ファイルに文字列を書き込む必要があります。

これをreveal_type(...)特別指示文(場合によってはhidden --shadow-fileオプション)と組み合わせて、文字列をタイプチェックすることもできます。

もう1つの方法は、mypy's main.pyのリバースエンジニアリングと再実装で、基本的に内部APIをハイジャックすることです。私は本当にこれが難しいとは思わない、ただちょっと醜いと壊れやすい。

(mypyは理論的には任意の文字列の型チェックをサポートすることができますが、コア開発者は原則としてmypyのAPIを拡張することに反対していません。開発者はより複雑なAPIを実装することに多少なりとも反対していますが、後からサポートする必要があります。 mypyのissueトラッカーのAPIの現在の状態)。

関連する問題