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

Und ich benutze Mypy, um diese Datei zu überprüfen. Es gibt einen Fehler.Was ist falsch, wenn Sie mypy verwenden, um den Typ zu überprüfen

Unten finden Sie die Fehlermeldung

"Dict Eintrag 0 hat nicht kompatiblen Typ "str": "int", erwartet "Bytes": "Any""

Aber ich don‘ t wissen warum

Antwort

0

Das Problem ist, dass AnyStr ist eigentlich ein Alias ​​für einen Typvar. Dies bedeutet, dass Ihr Programm ist eigentlich genau das entspricht Schreiben:

from typing import Dict, Any, AnyStr, TypeVar 

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

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

Das aber stellt uns vor ein Problem: Wie mypy soll, welche der beiden möglichen Alternativen folgern Sie für T wollte?

Es gibt drei mögliche Fehlerbehebungen. Sie können entweder ...

  1. Einen Weg finden, AnyStr mindestens zwei oder mehrere Male innerhalb Ihrer Art Signatur zu verwenden. Zum Beispiel, vielleicht entscheiden Sie, dass das wirklich mehr ist, was Sie meinten?

    def abc(xyz: AnyStr) -> Dict[AnyStr, Any]: 
        # etc 
    
  2. Verwenden Union[str, bytes] statt AnyStr:

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

    Wenn der Typ Unterschrift unangenehm lange zu erhalten beginnt, können Sie es verkürzen, indem eine Art Alias:

    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 
    
Verwandte Themen