2016-12-18 3 views
7

私はPython 3.5をMypyと一緒に使用して、スクリプトの基本的な静的検査を行っています。最近、私はOrderedDictを返すいくつかのメソッドをリファクタリングしましたが、キーと値の型を指定してリターンアノテーションを使用しようとしたときに、 "'type'オブジェクトが添字付きではないというエラーに遭遇しました。Mypy型アノテーションにOrderedDict K、V型を指定するにはどうすればよいですか?

削減例:

#!/usr/bin/env python3.5 

from collections import OrderedDict 

# this works 
def foo() -> OrderedDict: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

# this doesn't 
def foo2() -> OrderedDict[str, int]: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

print(foo()) 

そして、それを実行したときに、これは、Pythonの出力です:

Traceback (most recent call last): 
    File "./foo.py", line 12, in <module> 
    def foo2() -> OrderedDict[str, int]: 
TypeError: 'type' object is not subscriptable 

Mypyしかしコメントで型注釈に問題を持っていないし、私がしようとした場合、実際に警告が表示されます行うことresult[123] = 123

この原因は何ですか?

+1

(mypyバージョン0.501)。 – max

答えて

5

mypyに問題はありません(少なくとも、0.501ではなく)。 しかし、で、Python 3.6.0の問題です。 以下を考慮してください

from collections import OrderedDict 
from typing import Dict 

def foo() -> Dict[str, int]: 
    result: OrderedDict[str, int] = OrderedDict() 
    result['two'] = 2 
    return result 

このコードの両方がmypy(0.501)とPython(3.6.0)を満たすであろう。 DictOrderedDictに置き換えると、mypyはまだ満足できますが、実行するとTypeError: 'type' object is not subscriptableとなります。

Pythonインタプリタは、関数シグニチャの添え字OrderedDictを見て死ぬのは面白いですが、変数型の注釈でそれを受け入れるのは楽しいことです。

私の回避策は、機能シグネチャにOrderedDictの代わりにDictを使用することです(また、Pythonインタプリタが正しい署名を受け入れることを/とする場合は、これを修正する必要があるというコメントを追加する)。あなたもMutableMappingを使用している試すことができますどのような

+1

ええ、私は自分のコードで同じ回避策を使用して終了しました。 – Xarn

1

(この回答のように:https://stackoverflow.com/a/44167921/1386610)それが動作するようになりまし

from collections import OrderedDict 
from typing import Dict 

def foo() -> MutableMapping[str, int]: 
    result = OrderedDict() # type: MutableMapping[str, int] 
    result['foo'] = 123 
    return result 
関連する問題