2015-04-28 10 views
12

Im folgenden Code:IntelliJ-IDEA Python Typ Checker - falsche erwarteten Typ?

from typing import List 
def test() -> List[str]: 
    ret = ["Hi", "Hi"] 
    return ret 

Ich bin auf der Funktionsdefinition Zeile die folgende Warnung empfangen:

Expected type 'Integral", got 'str' instead 

ich keinen Grund sehen, warum dies würde interpretieren Python-Modul der IntelliJ IDEA- einfache Funktion als Rückgabe einer Liste von Integral anstelle von str. Ist das ein Typ Checker Bug?

+0

Ich denke, der Fehler ist von 'List [str]' selbst, anstatt die Rückkehr der Funktion - was * ist * 'typing.List'? – jonrsharpe

+0

Es ist ein Teil von mypy, der die Typprüfung auf Python erlaubt; Wenn Sie jedoch die Standardliste von Python (Kleinbuchstaben) verwenden, wie in def test() -> list [str], erhalten Sie genau den gleichen Fehler wie bei str. – Shookit

+3

Wenn Sie "Fehler" sagen, meinen Sie einen Python-Fehler oder eine Warnung von PyCharm? Vermutlich würde letzteres, als "liste [str]", überhaupt nicht funktionieren. Beachten Sie, dass z.B. * "PyCharm 4.5 EAP-Builds haben ** vorläufigen Support ** für PEP 484, da dieser PEP noch nicht abgeschlossen ist" * (https://www.jetbrains.com/pymarch/help/type-hinting-in-pycharm). html), also sollten Sie nicht zu überrascht sein, wenn es noch nicht voll funktionsfähig ist. – jonrsharpe

Antwort

0

Pycharm haben nur eine vorläufige Unterstützung für Typ Hinweise.

0

Beachten Sie, dass typing.List eine einfache Wrapper-Klasse ist, die erweitert Builttin list Klasse. Es hilft beim Typhinweis und erlaubt keine Erstellung einer new Liste mit sich selbst.

Hier ist der aktuelle Code für typing.List:

class List(list, MutableSequence[T], extra=list): 

    __slots__ =() 

    def __new__(cls, *args, **kwds): 
     if _geqv(cls, List): 
      raise TypeError("Type List cannot be instantiated; " 
          "use list() instead") 
     return _generic_new(list, cls, *args, **kwds) 

von typing.List[str] tun, versuchen Sie die Methode __getitem__ auf ein Objekt zu nennen typing.List (die eine Art ist). Beachten Sie auch, dass

Dies führt zu folgenden:

typing.List.__getitem__(str) 
# or 
list.__getitem__(str) 

Nun, wenn Sie sehen, was tut Liste Indizierungsverfahren erwarten, erwartet es eine ganze Zahl wie a[0], a[1]. In diesem Fall wird anstelle eines int wie 0, 1, es erhielt eine Typstr

Hoffnung, das gibt Ihnen eine ganzheitliche Sicht auf typing.List.

Verwandte Themen