00:00In diesem Video geht es um die neue Funktion der Nur-Positions-Argumente. Ich werde Sie mit einem Beispiel beginnen lassen. Ich möchte dieses Video mit einer eingebauten Funktion namens float()
beginnen.
00:09float()
kann verwendet werden, um Textstrings oder Zahlen in float
-Objekte zu konvertieren, wie hier. Wenn Sie die Funktion help()
über die eingebaute Funktion float
aufrufen, werden Sie bei der Signatur für float
feststellen, dass nach dem Parameter ein Schrägstrich (/
) steht. Was hat das zu bedeuten? Nun, es stellt sich heraus, dass es einen Parameter von float()
gibt, der x
heißt, und es ist nicht erlaubt, den Namen des Parameters beim Aufruf zu verwenden. Wenn Sie float()
verwenden, dürfen Sie Argumente nur durch die Position angeben, nicht durch ein Schlüsselwort. Ich möchte Ihnen zeigen, was ich meine. Beachten Sie auch hier den Schrägstrich (/
). Drücken Sie q
, um aus help()
herauszukommen. Wenn du also float()
noch einmal versuchst und x="3.8"
sagst – eine Textzeichenfolge – wirst du sehen, dass hier float() takes no keyword arguments
steht, nur dieses Positionsargument.
00:53Du kannst kein Schlüsselwort verwenden, wenn du das Argument angibst. Vor Python 3.8 gab es keine einfache Möglichkeit, in eigenen Funktionen festzulegen, dass Argumente nur positional sein sollten. Wenn Sie also etwas wie diese Funktion definieren – nennen wir sie incr()
(Inkrement).
01:10Wenn Sie incr()
aufrufen, und sagen wir, Sie geben ihr einen Fließkommawert, können Sie eine der beiden Methoden verwenden, und das ist normal für ein normales Argument. Und das ist, wo die Änderung in Python 3.8 kommt.
01:24Sie könnten die Inkrementfunktion incr()
so umschreiben, dass sie nur positionale Argumente akzeptiert. Es würde dann ungefähr so aussehen, mit einem Komma (,
) und einem Schrägstrich (/
), und der Rest ist derselbe.
01:40Wenn Sie also incr()
aufrufen, funktioniert das gut. Aber wenn Sie jetzt das Schlüsselwort verwenden, passiert etwas Neues. Hier steht incr() got some positional-only arguments passed as keyword arguments
.
01:55So wird eine Ausnahme ausgelöst und Sie erhalten ein TypeError
. Sie können dies quasi als Trennzeichen zwischen Ihren reinen Positionsargumenten und den normalen Argumenten verwenden. Lassen Sie mich das an einem anderen Beispiel ausprobieren.
02:07Definieren Sie eine neue Funktion namens greet()
. greet()
nimmt ein name
als reines Positionsargument, dann fügen Sie den Schrägstrich (/
) ein, damit Sie reine Positionsargumente mit regulären Argumenten kombinieren können. Hier ist also ein reguläres Argument von greeting
.
02:23Hier wird ein f-String mit greeting
zurückgegeben. Wenn du noch nicht mit f-strings gearbeitet hast, werde ich im Text unten einen Link zu Artikeln und Kursen darüber einfügen.
02:31Komma, Leerzeichen, das name
. Wenn du also greet()
aufrufst – noch einmal, der Standard greeting
wird "Hello"
sein.
02:37Du gibst das name
hier als reines Positionszeichen ein.
02:43Gut. Du könntest auch greet()
02:49aufrufen und ihm ein greeting
geben.
02:55Aber was du nicht tun kannst – oder was dir einen Fehler beschert – ist, wenn du name
,
03:08hier wirst du eine Ausnahme von einem TypeError
bekommen. Genau wie bei incr()
wurden auch bei greet()
einige Positionsargumente als Schlüsselwortargumente übergeben, insbesondere name
. Auf den ersten Blick können Positionsargumente ein wenig einschränkend wirken und dem Mantra von Python über die Wichtigkeit der Lesbarkeit widersprechen.
03:26Sie werden wahrscheinlich feststellen, dass es nicht viele Gelegenheiten gibt, bei denen Positionsargumente Ihren Code verbessern. Unter den richtigen Umständen kann es Ihnen jedoch eine gewisse Flexibilität beim Entwerfen von Funktionen geben.
03:35Erstens sind Nur-Positions-Argumente sinnvoll, wenn Sie Argumente haben, die zwar eine natürliche Reihenfolge haben, aber nur schwer mit einem beschreibenden Namen versehen werden können. Ein weiterer Vorteil der Verwendung von Nur-Positions-Argumenten ist, dass Sie Ihre Funktionen leichter refaktorisieren können – insbesondere können Sie die Namen Ihrer Parameter ändern, ohne sich Sorgen machen zu müssen, dass anderer Code von diesen Namen abhängt.
03:57Um diese Informationen zu wiederholen, wie geben Sie Nur-Positions-Argumente an? Sie verwenden den Schrägstrich (/
), um zu kennzeichnen, dass die Argumente vor dem Schrägstrich durch die Position angegeben werden müssen. Um mehr über die Slash-Notation zu erfahren, bietet PEP 457 eine ausführliche Diskussion darüber. PEP 570 geht viel tiefer auf die reinen Positionsparameter in Python ein. Links zu beiden finden Sie im Text unter diesem Video.
04:20Die Ergänzung zu reinen Positionsargumenten wären reine Schlüsselwortargumente, und die sind in jeder Version von Python 3 verfügbar. Sie können angeben, dass Sie nur Schlüsselwortargumente wünschen, indem Sie ein Sternchen (*
) verwenden.
04:31Alle Argumente nach *
müssen mit einem Schlüsselwort angegeben werden. Hier ist ein Beispiel für die Konvertierung in Fahrenheit, und Sie können hier sehen, dass es ein Schlüsselwort-Argument von celsius
hat.
04:46Lassen Sie mich diese Funktion ausprobieren. Um hier also ein Schlüsselwort anzugeben, fügen Sie ein *
ein und fügen dann das Schlüsselwortargument an – in diesem Fall celsius
. Und in diesem Fall, return
05:0232 + celsius * 9 / 5
. Wenn man also to_fahrenheit()
aufruft und einfach einen Wert angibt, z.B. 40
Grad Celsius, heißt es hier, dass takes 0 positional arguments but 1 was given
.
05:16So ist es erforderlich, dass man ein Schlüsselwort hat, um es richtig aufrufen zu können. Außerdem können Sie je nach Situation reine Positionsargumente, reguläre Argumente und Schlüsselwortargumente kombinieren. Dazu geben Sie sie durch den Schrägstrich (/
) und das Sternchen (*
) getrennt an.
05:35So würde es etwa so aussehen. Hier, ein positional-only von text
, der Schrägstrich (/
). Hier das Standardargument.
05:46Und jetzt, nach dem border
, mit dem *
, dem Nur-Schlüsselwort-Argument von width
, das einen Standardwert von 50
hat.
05:54Sie geben einen f-String mit einem Leerzeichen vor dem Wert für das text
-Argument und dann ein weiteres Leerzeichen zurück. Und dann verwendest du die Text-String-Methode von .center()
mit zwei Parametern, die du von diesen Argumenten nimmst, width
und border
.
06:08Das einzige, das positional ist, ist text
. Man könnte mit headline()
beginnen und "Positional-only"
.
06:18Hier kann man den Standardwert sehen, der diese Art von Rahmen mit einem width
von 50
sein wird, der ungefähr so aussieht. Da es sich auch hier um einen reinen Positionswert handelt, würde ein text
,
06:35 einen Fehler, ein TypeError
, auslösen. Bei border
handelt es sich um ein reguläres Argument. In diesem Fall könnten Sie stattdessen einfach einen Wert angeben, z. B. das Gleichheitszeichen ("="
).
06:49Oder Sie könnten tatsächlich angeben, dass border
gleich ist, z. B. ein Doppelpunkt (:
). Es werden beide Formen akzeptiert. Aber width
muss mit einem Schlüsselwort spezifiziert werden, wenn man es eingeben will…
07:07Überschreibt die Vorgabe mit einem Wert von 38
.
07:15Wenn man nur den Wert 38
angibt, würde das wieder eine Ausnahme auslösen und eine TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
bekommen. Auch hier muss es sich also um ein Schlüsselwortargument handeln.
07:29Wie Sie sehen können, können reine Positionsargumente reguläre Argumente und reine Schlüsselwortargumente gut ergänzen. Im nächsten Video erfahren Sie, wie Python 3.8 die Typüberprüfung durch die Verwendung präziserer Typen verbessert.