2015-04-28 87 views
12

在下面的代碼:IntelliJ-IDEA的Python類型檢查器 - 不正確的預期類型?

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

我收到的函數定義行以下警告:

Expected type 'Integral", got 'str' instead 

我看不出有任何理由的IntelliJ-IDEA的Python模塊會將此解釋簡單的函數返回一個積分列表而不是str。這是一個類型檢查器錯誤?

+0

我認爲錯誤來自'List [str]'本身,而不是函數的返回值 - what * is * typing.List'? – jonrsharpe

+0

它是mypy的一部分,它允許對Python進行類型檢查;然而,如果你使用python的標準列表(小寫),就像在def test() - > list [str]中一樣,你會得到與str完全相同的錯誤。 – Shookit

+3

當你說「錯誤」時,你的意思是一個Python錯誤還是來自PyCharm的警告?據推測,後者作爲「名單」根本就不起作用。請注意,例如*「PyCharm 4.5 EAP版本對PEP 484有**初步支持**,因爲這個PEP還沒有最終確定」*(https://www.jetbrains.com/pycharm/help/type-hinting-in-pycharm。 HTML),所以你不應該太驚訝,如果它還沒有完全正常工作。 – jonrsharpe

回答

0

Pycharm只對類型提示有一些初步支持。

0

注意typing.List是一個簡單的包裝類,擴展內置list類。它有助於提示類型,並且不允許使用它自己創建new列表。

這裏是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) 

這樣做typing.List[str],您要調用的方法__getitem__對象typing.List(這是一種)上。還要注意的是

這轉化爲以下幾點:

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

現在,如果你看到有哪些呢列表索引方法預期,預計像a[0], a[1]整數。在這種情況下,而不是像int0, 1,它收到一個str

希望這給你的typing.List一個更全面的觀點。