2017-05-15 5 views
1

Meine IDE (PyCharm) versagt die automatische Vervollständigung folgendes:Typing mit integrierten Kartenfunktion

from typing import List, TypeVar 

T = TypeVar('T') 

def listify(x: T) -> List[T]: 
    return [x] 

str_list: List[str] = ['a', 'b'] 
listified = map(listify, str_list) 
listified[0].<TAB> # autocomplete fail, IDE fails to recognize this is a List 

Ist das ein Problem mit meinem IDE, oder ist typing nicht kompatibel mit map?

Was auch immer die Antwort, ich durch Umwickeln map zu beheben versucht:

from typing import Callable, Iterable, List, TypeVar 

T = TypeVar('T') 
U = TypeVar('U') 

def listify(x: T) -> List[T]: 
    return [x] 

def univariate_map(func: Callable[[T], U], x: Iterable[T]) -> Iterable[U]: 
    return map(func, x) 

str_list: List[str] = ['a', 'b'] 
listified = univariate_map(listify, str_list) 
listified[0].<TAB> # still fails to autocomplete 

Auch dies ist ein Problem mit meinem IDE, oder sind meine Erwartungen an das typing Modul nicht richtig?

Antwort

1

Das Problem ist, dass map einen Iterator zurückgibt und Sie können keine Iteratoren ([0]) indexieren. Wenn Sie die map zu einem list werfen dann erkennt PyCharm den Typ:

from typing import List, TypeVar 

T = TypeVar('T') 

def listify(x: T) -> List[T]: 
    return [x] 

str_list: List[str] = ['a', 'b'] 
listified = list(map(listify, str_list)) # list is new here 
listified[0]. 

Screenshot:

enter image description here

Jedoch scheint es, wie PyCharm den Typ für Ihre Funktion auch ohne Typ Hinweise ableiten kann (in diesem Fall).

+0

Hoppla, das war albern. Tut mir leid, ich hätte versuchen sollen, etwas echten Code zu schreiben, anstatt nur zu versuchen, die Autovervollständigung durchzuführen. Vielen Dank! – dshin

+0

@abccd ok! Du hast mich da wirklich verwirrt :) – MSeifert