2017-12-05 7 views
0

Die docs auf Dict zeigen sie als generische Art, wie diese verwendet werden:Können generische Typenhinweise wie Dict und List blank ohne eckige Klammern verwendet werden?

auch, typ Hinweis richtig, natürlich Es wäre
def get_position_in_index(word_list: Dict[str, int], word: str) -> int: 
    return word_list[word] 

word_list oben als dict:

def get_position_in_index(word_list: dict, word: str) -> int: 
    return word_list[word] 

Aber ist es richtig, Dict als Typhinweis zu verwenden, um eine dict mit Schlüsseln und Werten irgendeines Typs anzuzeigen, so?

def get_position_in_index(word_list: Dict, word: str) -> int: 
    return word_list[word] 

(Und ebenso können auch andere generische Typen wie List und Sequence auf diese Weise nackten verwendet werden?)

Antwort

2

Ja, Dict betrachtet wird ein Alias ​​für Dict[Any, Any] zu sein. (Und dict ist auch ein Alias ​​für Dict[Any, Any]).

Dies ist der Fall für jeden generischen Typ, egal ob es ein eingebauter oder ein benutzerdefinierter Typ ist: Wenn Sie die Typparameter weglassen, werden sie standardmäßig auf Any gesetzt. Dies wird in der Generics section of PEP 484 angegeben (Hervorhebung hinzugefügt):

Zusätzlich Any ist ein gültiger Wert für jede Variable. Beachten Sie Folgendes:

def count_truthy(elements: List[Any]) -> int: 
    return sum(1 for elem in elements if element) 

Dies entspricht die allgemeine Notation weggelassen und nur zu sagen elements: List.

Das heißt, ich denke, die allgemeine Empfehlung ist, dass Sie vollständig Dict[Any, Any] der Verwendung nur Dict stattdessen schreiben sollte - explicit is better then implicit, und so weiter.

Der einzige Nachteil ist, dass Ihre Signaturen für Funktionstypen jetzt länger sind. Aber wir können das umgehen, indem wir Aliase verwenden:

from typing import Dict, Any 

AnyDict = Dict[Any, Any] 
WordDict = Dict[str, int] 

# Equivalent to your first code sample 
def get_position_in_index_1(word_list: WordDict, word: str) -> int: 
    return word_list[word] 

# Equivalent to your second and third code samples 
def get_position_in_index_2(word_list: AnyDict, word: str) -> int: 
    return word_list[word] 
Verwandte Themen