Ich übe die Verwendung von Typhinweisen in Python 3.5. Einer meiner Kollegen verwendet typing.Dict
:
import typing
def change_bandwidths(new_bandwidths: typing.Dict,
user_id: int,
user_name: str) -> bool:
print(new_bandwidths, user_id, user_name)
return False
def my_change_bandwidths(new_bandwidths: dict,
user_id: int,
user_name: str) ->bool:
print(new_bandwidths, user_id, user_name)
return True
def main():
my_id, my_name = 23, "Tiras"
simple_dict = {"Hello": "Moon"}
change_bandwidths(simple_dict, my_id, my_name)
new_dict = {"new": "energy source"}
my_change_bandwidths(new_dict, my_id, my_name)
if __name__ == "__main__":
main()
Beide funktionieren einwandfrei, es scheint keinen Unterschied zu geben.
Ich habe die typing
Moduldokumentation gelesen .
Zwischen typing.Dict
oder dict
welche soll ich im Programm verwenden?
python
dictionary
type-hinting
Sarit
quelle
quelle
def a(b: int) -> bool:
ist ein Syntaxfehler in Python 2.7, und ich denke, es ist auch ein Syntaxfehler in älteren Versionen von Python 3.Antworten:
Es gibt keinen wirklichen Unterschied zwischen der Verwendung einer Ebene
typing.Dict
unddict
, nein.Allerdings
typing.Dict
ist eine generische Art , die Sie angeben , die Art des Schlüssels und Werte kann auch , um sie flexibler zu machen:def change_bandwidths(new_bandwidths: typing.Dict[str, str], user_id: int, user_name: str) -> bool:
Daher kann es durchaus sein, dass Sie zu einem bestimmten Zeitpunkt in Ihrer Projektlaufzeit das Wörterbuchargument etwas genauer definieren möchten. Zu diesem Zeitpunkt ist das Erweitern
typing.Dict
auftyping.Dict[key_type, value_type]
eine „kleinere“ Änderung als das Ersetzendict
.Sie können dies noch allgemeiner gestalten, indem Sie hier
Mapping
oderMutableMapping
eingeben. Da Ihre Funktion das Mapping nicht ändern muss, bleibe ich dabeiMapping
. Adict
ist eine Zuordnung, aber Sie können auch andere Objekte erstellen, die auch die Zuordnungsschnittstelle erfüllen, und Ihre Funktion funktioniert möglicherweise weiterhin mit diesen:def change_bandwidths(new_bandwidths: typing.Mapping[str, str], user_id: int, user_name: str) -> bool:
Jetzt teilen Sie anderen Benutzern dieser Funktion klar mit, dass Ihr Code die übergebene Zuordnung nicht wirklich ändert
new_bandwidths
.Ihre eigentliche Implementierung erwartet lediglich ein druckbares Objekt. Das mag eine Testimplementierung sein, aber so wie es aussieht, würde Ihr Code weiterhin funktionieren, wenn Sie ihn verwenden
new_bandwidths: typing.Any
, da jedes Objekt in Python druckbar ist.quelle
{"name": "bob", "age" : 51}
wäre das so etwas wietyping.Mapping[Union[str, int]
? Was ist mit einem verschachtelten Wörterbuch wie{"person": {"name":"bob", "age": 51}
wäre das wie etwas seintyping.Mapping[str, typing.Mapping[Union[str, int]]
? Die VerwendungUnion
dieser Funktion stört mich, da es sich nicht um ein striktes Schema handelt, da keine Reihenfolge vorliegt. Vielleicht ist das in Ordnung oder gibt es eine Alternative?Union
Frage, die ich sehe, es ist immer noch eine offene Diskussion. Github.com/python/typing/issues/28typing.Dict
ist eine generische Version vondict
:Hier können Sie den Schlüsseltyp und die Werte im Diktat angeben:
Dict[str, int]
quelle