2016-08-09 129 views
2

Da Python ist dynamisch typisiert, natürlich können wir so etwas tun:Gibt es tatsächlich Unionstypen in Python?

def f(x): 
    return 2 if x else "s" 

, aber es war die Art und Weise Python tatsächlich verwendet werden soll? Oder gibt es Unionstypen in dem Sinne, wie sie es zum Beispiel im Racket tun? Oder verwenden wir sie nur wie folgt:

def f(x): 
    if x: 
     return "x" 

wo die einzige "Union", die wir brauchen, ist mit keiner?

+0

Um zu verdeutlichen, meinen Sie die [union types von * Typed * Racket] (https://docs.racket-lang.org/ts-guide/types.html#%28part._.Union_.Types%29) ? Python hat nichts dergleichen. –

Antwort

7

Union Typisierung wird nur dann benötigt, wenn Sie eine statisch typisierte Sprache, wie Sie erklären müssen, dass ein Objekt eine von mehreren Arten zurückgeben kann (in Ihrem Fall ein int oder str, oder in dem anderen Beispiel str oder NoneType).

Python Angebote in Objekte nur, so dass es nie notwendig ist, auch "Union-Typen" zu berücksichtigen. Python-Funktionen geben zurück, was sie zurückgeben, wenn der Programmierer verschiedene Typen für unterschiedliche Ergebnisse zurückgeben möchte, dann ist das ihre Wahl. Die Wahl ist dann eine Architekturwahl und macht für den Python-Interpreter keinen Unterschied (es gibt also nichts, was man hier "benchmarken" könnte).

Python 3.5 hat einen Standard für die Einführung Hinweise optional Art zu schaffen, und das Standard enthält Union[...] und Optional[...] Annotationen.

+0

Danke! Ich verstehe, dass Python nicht statisch getippt ist. Aber ich wollte wissen, ob es in der Praxis jemals notwendig sein würde, eine Funktion zu haben, die auf der Basis des Parameters mehrere Typen zurückgibt, oder ob es IMMER in python um einen Weg herum geht? – Lana

+0

@Lana: Das ist viel zu weit. Aber werfen Sie einen Blick auf 'pickle.loads()' oder 'json.loads()'. Diese geben beliebige Objekte zurück, basierend darauf, welche Daten geladen werden. –

+0

@Lana: und wieder, es ist eine Software-Architektur Wahl, was eine Funktion zurückgibt. Es ist eine gute Übung, konsistent zu sein und das, was zurückgegeben wird, einzuschränken, aber "ein Weg dahin" verwendet nur gute Software-Entwicklungspraktiken. Wenn Ihre Funktion beispielsweise "True, False, None oder Integer" zurückgeben kann, müssen Sie Ihr Funktionsdesign überdenken. –

1

zu @MartijnPieters Hinzufügen beantworten:

Aber die Art und Weise Python tatsächlich verwendet werden soll?

Die Rückgabe unterschiedlicher Typen je nach Param ist in keiner Sprache eine gute Übung. Dies macht das Testen, Aufrechterhalten und Erweitern des Codes wirklich schwierig und IMHO ist ein Anti-Pattern (aber natürlich manchmal notwendiges Übel). Die Ergebnisse sollten mindestens über eine gemeinsame Schnittstelle verfügen.

Der einzige Grund, warum union in C eingeführt wurde, war der Leistungsgewinn. Aber in Python haben Sie diesen Leistungsgewinn nicht aufgrund der dynamischen Natur der Sprache (wie Martijn bemerkte). Die Einführung von union würde die Leistung verringern, da die Größe union immer die Größe des größten Elements ist. Daher wird Python niemals C-like union haben.

+0

Danke! Genau das möchte ich aber wissen. Wann ist die Verwendung von Unionen in Python ein notwendiges Übel? Und wenn wir von "Gewerkschaften" sprechen, reden wir über eine Union mit keiner? (wenn ich viel in Python bemerkt habe) oder Verbindungen zwischen verschiedenen Typen?Ich habe mich gefragt, ob es einen Beispielcode gibt, der das zeigt. – Lana

+0

Beachten Sie, dass das OP nicht über die C-Union spricht. Ich denke eher, dass sie ein Java oder C# System haben. –

+0

@Lana Wie Martijn bemerkte 'json.loads()' ist ein Beispiel für ein notwendiges Übel. "Gewerkschaften" mit "keine" ist eine allgemeine Praxis, aber IMO sollte auch vermieden werden. Vor allem in größeren Projekten kann man nicht aufhören zu lesen, denn dieses 'NoneType Objekt hat keine Attribute xxx' Protokolle. Meine persönliche Meinung: Eine Funktion == ein Rückgabetyp. – freakish