00:00 このビデオでは、位置のみの引数という新機能についてお話します。 まずは例題から始めてもらいます。 このビデオではまず、float()
という組み込み関数についてお話したいと思います。
00:09float()
は、このようにテキスト文字列や数値を float
オブジェクトに変換するために使用することができます。 組み込み関数float
のhelp()
関数を出して、このfloat
のシグネチャを見てみると、パラメータの後にスラッシュ(/
)があることに気がつくと思います。 これは何を意味するのでしょうか。 それは、float()
のパラメータは1つで、x
という名前であることがわかりました。 float()
を使うときは、キーワードではなく位置だけで引数を指定することが許されているんだ。 どういうことか、お見せしましょう。 それではもう一度、ここにあるスラッシュ(/
)に注目してください。 q
を押すと、help()
から抜け出せます。 そこでもう一度float()
を試して、x="3.8"
-テキスト文字列-と言うと、ここではfloat() takes no keyword arguments
と表示されます。この位置引数だけです。
00:53 引数を指定するときにキーワードを使用することはできないんですね。 Python 3.8以前は、自作関数で引数を位置指定のみにすることを簡単に指定する方法がありませんでした。 そのため、このような関数-ここではincr()
(increment)と呼ぶことにします。
01:10 incr()
を呼び出して、floatを与えたとすると、どちらの方法でも使用でき、それは通常の引数の場合です。 そこがPython3.8で変更されたところだ
01:24increment incr()
関数を位置だけの引数を受け付けるように書き換えればいいんだよ。 コンマ(,
)の後にスラッシュ(/
)を入れて、あとは同じです。
01:40 incr()
を呼び出すと、うまくいきますね。 しかし、もし今キーワードを使うとしたら、新しいことが起こります。 ここにはincr() got some positional-only arguments passed as keyword arguments
.
01:55と書いてありますが、これは例外を発生させてTypeError
を与えることになるわけです。 これはほとんど位置だけの引数と通常の引数の間の仕切りとして使うことができます。
02:07 greet()
という名前の新しい関数を定義してください。 greet()
は位置のみの引数として name
を取り、そこにスラッシュ (/
) を入れて、位置のみの引数と通常の引数を組み合わせることができるようにします。 つまり、ここにgreeting
の正規引数があります。
02:23 ここでgreeting
を含むf-stringを返すことになります。 まだf文字列を扱ったことがない人は、下の文章にそれに関する記事や講座へのリンクを貼っておきます。
02:31 カンマ、スペース、name
のことです。 つまり、greet()
を呼び出すとき、もう一度言いますが、デフォルトのgreeting
は"Hello"
になります。
02:37 ここでname
をポジションオンリーで入力します。
02:43 いいね。 greet()
02:49 を呼び出して greeting
を与えることもできます。
02:55 しかし、できないこと、あるいはエラーになることは、name
,
03:08 と入力すると TypeError
という例外が発生するところですね。 ここでも、前の incr()
のときと同じように、greet()
にはキーワード引数として位置だけの引数がいくつか渡され、特に name
が渡されました。
03:26位置のみの引数がコードを改善する場面は多くないことが分かると思います。
03:35 第一に、位置のみの引数は、自然な順序を持つが良い説明的な名前を付けるのが難しい引数がある場合に意味を持ちます。 特に、他のコードがそれらの名前に依存することを心配せずに、パラメータの名前を変更できます。
03:57 この情報を繰り返すと、位置のみの引数はどのように指定するのでしょうか。 スラッシュ (/
) を使って、その前の引数が位置によって指定されなければならないことを表します。 スラッシュ記法について詳しく知るには、PEP 457に詳しい説明があります。 PEP 570 は Python の位置指定のみのパラメータについてより深く掘り下げています。
04:20位置のみの引数を補完するのはキーワードのみの引数で、これらはPython 3 のどのバージョンでも利用可能です。
04:31*
以降の引数はキーワードで指定する必要があります。 ここでは華氏に変換する例を示しますが、キーワードのみの引数としてcelsius
を指定していることがわかります。
04:46 この関数を試してもらいましょう。 ここで、キーワードのみを指定するには、*
を付けて、その後にキーワード引数を付けます(この場合はcelsius
です)。 そしてこの場合、return
05:0232 + celsius * 9 / 5
となります。 ここで、to_fahrenheit()
を呼び出して、40
摂氏という値を与えると、takes 0 positional arguments but 1 was given
.
05:16 と表示されるので、適切に呼び出すにはキーワードが必要でした。 あと、状況によっては、位置だけの引数、通常の引数、キーワードだけの引数を組み合わせたい場合もあります。 その場合は、そのスラッシュ(/
)とアスタリスク(*
)で区切って指定します。
05:35So こんな感じです。 ここで、text
の位置指定オンリー、スラッシュ(/
)。 ここでは、標準の引数。
05:46 そして、border
の後、*
を使って、width
のキーワードのみの引数、デフォルト値は50
。
05:54 text
引数の値の前にスペースを入れて、さらにスペースを入れたf文字列を返していますね。 で、その引数から取ってるwidth
とborder
の2つのパラメータで.center()
のテキスト文字列メソッドを使ってる。
06:08 位置的にはtext
だけなんだけどね。 headline()
から始まって"Positional-only"
.
06:18ここで、width
が50
でそのタイプのボーダーになるデフォルト値を見ることができます、そのように見えます。 繰り返しますが、これは位置のみなので、text
,
06:35 を指定するとエラーになり、TypeError
が発生します。 border
の場合は、通常の引数です。
06:49 あるいは、border
はコロン(:
)と等しいと指定することも可能です。 これはどちらのスタイルも受け入れる。
07:07 デフォルトの値 38
を上書きします。
07:15 38
という値だけを指定すると、これまた例外が発生して TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
が表示されるでしょう。
07:29 このように、位置のみの引数は、通常の引数とキーワードのみの引数をうまく補完することができるのです。 次のビデオでは、Python 3.8がより正確な型を使用することでどのように型チェックを強化しているかを学びます。