13

Die entpackenden/splat Operatoren * und ** unterscheiden sich weit in ihrer Anwendbarkeit über Python-Versionen (2.7, 3.x < 3.5 und 3.x> = 3.5).Wo sind Pythons Splat-Operatoren * und ** gültig?

Zum Beispiel:

        | 2.7 | 3.1-3.4 | 3.5 
---------------------------------------------------------------------- 
function(*args)       ✓   ✓   ✓  

x, *y, z = [1, 2, 3, 4, 5]    x   ✓   ✓  

{**x, **y}        x   x   ✓  

Gibt es weitere Unterschiede zwischen den verschiedenen Versionen, die ich verpasst habe? Ich schaue durch PEP und Readmes, aber die Dokumente sind nicht detailliert mit diesem.

Antwort

17

Um 1992 (nicht sicher über Python-Version). Dies ist aus der Grammatikdatei von Python 1.0.1.

# 06-Apr-92: 
# Use only '*' for varargs list 

# 31-Mar-92: 
# Tighten syntax for try statements 

# 27-Feb-92: 
# Allow NEWLINE* after eval input 

# 16-Jan-92: 
# Added '*' as alternative for '+' in varargs syntax 
# (Not sure which alternative is better yet.) 

# 11-Jan-92: 
# Variable length argument list syntax added: def f(a, b, +rest): ... 

Python 1.4+:

Schlüsselwort-Argument: Funktionen und in Python geschrieben Methoden jetzt Schlüsselwort Argumenten des Formulars mit keyword = value aufgerufen werden können.

Python 1.6+

Es gibt jetzt eine spezielle Syntax, die Sie anstelle der apply() Funktion nutzen zu können. f(*args, **kwds) entspricht apply(f, args, kwds). Sie können auch Variationen f(a1, a2, *args, **kwds) verwenden und Sie können eine oder die andere auslassen: f(*args), f(**kwds).

Python <= 2.7:

Tuple Parameter in Python auspackte 3.0 entfernt.

PEP 3113: Tuple Parameter entfernt auszupacken. Sie können def foo(a, (b, c)): ... nicht mehr schreiben. Verwenden Sie stattdessen def foo(a, b_c): b, c = b_c.

Python 3.0+

PEP 3132: Iterable Auspacken Erweitert. Sie können jetzt Dinge wie a, b, *rest = some_sequence schreiben. Und sogar *rest, a = stuff. Das Restobjekt ist immer eine (möglicherweise leere) Liste; die rechte Seite kann beliebig iterierbar sein.

PEP 3102: Schlüsselwort-Argumente. Benannte Parameter, die nach *args in der Parameterliste auftreten, müssen über die Schlüsselwortsyntax im Aufruf angegeben werden.Sie können auch mit einem nackten * in der Parameterliste verwenden , um anzuzeigen, dass Sie nicht ein variabler Länge Argumentliste akzeptieren, aber Sie tun Keyword-only Argumente

Python 3.5+

PEP 448 haben , zusätzliche entpacken Verallgemeinerungen.


Soweit ich weiß, gibt es keine einzige Seite, die alle Syntaxänderungen auflistet. Die Syntaxänderungen pro Version sind im Abschnitt What's new in Python aufgeführt, oder Sie können die Grammatikspezifikationen der einzelnen Versionen überprüfen, um die Unterschiede zu sehen.

+0

Schöne Forschung; Wann wurde die Varargs-Syntax (* name) eingeführt? Dies ist älter als Python 3 (oder wurde möglicherweise rückportiert) –

+0

@Chris_Rands Meintest du den in Zuordnung verwendeten? –

+0

Ich meinte wie 'max (* (1,2,3))' –

Verwandte Themen