2017-12-01 31 views
0
from typing import Dict, List, Any, AnyStr, TypeVar 
def abc(xyz: str) -> Dict[AnyStr, Any]: 
    return {"abc": 1} 

そして私はこのファイルをチェックするためにmypyを使用します。それはエラーを出しています。 ": "どれ" "mypyを使用してタイプをチェックする際に何が問題になるのですか?

しかし、私はドン」;: " "" 期待" バイトのint以下

" Dictのエントリ0がある互換性のない型" strのエラーメッセージです知っている理由

答えて

0

問題は、AnyStrは実際にはtypevarのエイリアスです。これはあなたのプログラムは、実際に書き込みとまったく同じであることを意味する:

from typing import Dict, Any, AnyStr, TypeVar 

T = TypeVar('T', str, bytes) 

def abc(xyz: str) -> Dict[T, Any]: 
    return {"abc": 1} 

これは、しかし、問題を私たちに提示:mypyあなたはTのために望んでいた2つの可能な選択肢のどれを推測することになっていますか?

3つの修正が考えられます。あなたは...どちらかができ

  1. はあなたのタイプの署名内AnyStrに少なくとも2回以上使用していくつかの方法を見つけます。たとえば、おそらくあなたはこれが本当にあなたが意味していたより多くのことを決めるでしょうか?

    def abc(xyz: AnyStr) -> Dict[AnyStr, Any]: 
        # etc 
    
  2. 代わりAnyStrの使用Union[str, bytes]

    from typing import Union, Dict, Any 
    
    def abc(xyz: str) -> Dict[Union[str, bytes], Any]: 
        # etc 
    

    型シグネチャが不快に長い取得し始めている場合は、タイプの別名を使用して、それを短縮することができます

    from typing import Union, Dict, Any 
    
    # Note: this isn't a great type alias name, but whatever 
    UnionStr = Union[str, bytes] 
    
    def abc(xyz: str) -> Dict[UnionStr, Any]: 
        # etc