用語比較
位置専用引数とキーワード専用引数の違い|/と*の位置をPython3エンジニア認定基礎試験で判断する
位置専用引数は/(スラッシュ)より前に置き、キーワードで渡せない引数で、キーワード専用引数は*より後に置き、キーワード引数としてしか渡せない引数です。公式チュートリアル4.9.3は、/と*の間を位置でもキーワードでも渡せる引数として示しています。
Python 3 エンジニア認定基礎試験では、/と*の位置を見て、ある呼び出し方がそのまま動くかTypeErrorになるかを判断させる問題が出ます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
位置専用引数とキーワード専用引数の要点
位置専用引数
/より前に置く。引数の順序が重要で、キーワードで引数を渡せない。
キーワード専用引数
*より後に置く。キーワード引数として渡す必要がある。
違いを表で確認
| 比較軸 | 位置専用引数 | キーワード専用引数 |
|---|---|---|
| 目印の記号と置く位置 | /(スラッシュ)の前に置く | 最初のキーワード専用引数の直前に*を置く |
| 渡せる形 | 位置でだけ渡せる(キーワードでは渡せない) | キーワードでだけ渡せる(位置では渡せない) |
| 公式チュートリアルの例 | def pos_only_arg(arg, /): で pos_only_arg(1) は1を出力 | def kwd_only_arg(*, arg): で kwd_only_arg(arg=3) は3を出力 |
| 禁止された渡し方をしたとき | pos_only_arg(arg=1) は TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg' | kwd_only_arg(3) は TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given |
| 公式チュートリアルが勧める場面 | 引数の名前をユーザーに知らせる必要がないとき。APIで将来の引数名の変更に備えるとき | 引数の名前に意味があり関数の定義がより明らかになるとき。引数の順番に縛られることを避けたいとき |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
/と*のどちらが「位置専用」なのか取り違える初学者
/の前が位置専用、*の後がキーワード専用です。def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): の形で、左から順に位置専用、位置またはキーワード、キーワード専用と並ぶと覚えます。
引数名を書いて呼べば必ず通ると思っている人
位置専用引数はキーワードで引数を渡せません。公式チュートリアルの例では、pos_only_arg(arg=1) が TypeError(got some positional-only arguments passed as keyword arguments)になります。
*argsの後ろに書いた引数の扱いが分からない人
公式チュートリアル4.9.4は、*args引数の後にある仮引数はキーワード専用引数で、キーワード引数としてのみ使えると説明しています。def concat(*args, sep="/") では、sepを変えたいとき concat("earth", "mars", "venus", sep=".") のようにキーワードで渡し、'earth.mars.venus' が返ります。
問題文から答えを選ぶ手順
- 1
関数定義に/と*があるか確認する
どちらも無ければ、引数は位置またはキーワードで渡せます。/と*は省略できます。
- 2
引数が/より前か確認する
/より前の引数は位置専用です。呼び出し側で引数名=値の形になっていれば
TypeErrorです。 - 3
引数が*(または*args)より後か確認する
*より後の引数はキーワード専用です。呼び出しで位置引数として渡していれば、
TypeErrorになります。 - 4
/と*の間の引数を確認する
/と*の間の引数は、位置でもキーワードでも渡せます。
試験での見分け方
- 1/より前に書かれた引数は位置専用で、キーワードで渡せない。
- 2*より後に書かれた引数はキーワード専用で、キーワード引数として渡す必要がある。
- 3/と*の間の引数は、位置でもキーワードでも渡せる。
- 4関数定義に/も*もなければ、引数は位置またはキーワードで渡せる。
- 5*argsの後にある仮引数もキーワード専用になる。
誤答しやすい選択肢
/と*の役割を逆に覚える
修正: /の前が位置専用、*の後がキーワード専用です。公式チュートリアルの def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): を見て、記号の左右どちらが制限されるかを確認します。
位置専用引数を引数名=値の形で渡してしまう
修正: 位置専用引数はキーワードで引数を渡せません。公式チュートリアルの例では pos_only_arg(arg=1) が TypeError(pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg')になります。エラー文の語はpositional-onlyです。
キーワード専用引数を位置で渡してしまう
修正: kwd_only_arg(3) は TypeError(kwd_only_arg() takes 0 positional arguments but 1 was given)になります。kwd_only_arg(arg=3) のようにキーワードで渡すと3が出力されます。
combined_exampleの呼び出しで、すべて位置かすべてキーワードで渡せると考える
修正: def combined_example(pos_only, /, standard, *, kwd_only): では、combined_example(1, 2, 3) も combined_example(pos_only=1, standard=2, kwd_only=3) もTypeErrorになります。pos_onlyは位置、kwd_onlyはキーワードで渡し、standardはどちらでも構いません。
確認問題
Q1def combined_example(pos_only, /, standard, *, kwd_only): に対して combined_example(1, 2, kwd_only=3) を実行すると?
答え: 1 2 3 が出力される
pos_onlyは位置、standardは位置、kwd_onlyはキーワードで渡しており、どの引数も定義で許された渡し方です。公式チュートリアルでもこの呼び出しは1 2 3を出力します。
Q2同じ combined_example に対して combined_example(1, 2, 3) を実行すると?
答え: TypeErrorになる
kwd_onlyはキーワード専用なので、3を位置で渡せません。公式チュートリアルでは、TypeErrorのエラー文に takes 2 positional arguments but 3 were given と表示されます。
Q3def pos_only_arg(arg, /): に対して pos_only_arg(arg=1) を実行したときのTypeErrorの文面に含まれる語は?
答え: positional-only arguments passed as keyword arguments
公式チュートリアルの例では、エラー文に pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg' と表示されます。位置専用の引数をキーワードで渡したことを示しています。
Q4def foo(name, **kwds): return 'name' in kwds で、Trueを返す呼び出し方はある?
答え: 無い(def foo(name, /, **kwds) にすれば可能になる)
公式チュートリアルは、foo(1, **{'name': 2}) が TypeError(got multiple values for argument 'name')になると示し、/を使えばnameは位置引数、'name'はキーワード引数のキーワードとして認識されると説明しています。
到達チェック
- /の前の引数が位置専用で、キーワードで渡せないと説明できる
- *の後の引数がキーワード専用で、キーワードで渡す必要があると説明できる
- /と*の間の引数が位置でもキーワードでも渡せると説明できる
- 公式チュートリアルが示す位置専用とキーワード専用の使い分けを挙げられる
関連ページで確認する
- 制御構造ツールの章を読む収録問題の解説で、引数の指定と関数定義の扱いを確認する。
- キーワード引数を個別に確認位置またはキーワードのどちらでも渡せる条件と、位置専用の引数をキーワードで渡したときの
TypeErrorを確認する。 - キーワード専用引数を個別に確認*を置く位置と、位置引数で渡したときの
TypeErrorを確認する。 - *args と **kwargs の違い余った位置引数をタプルで、余ったキーワード引数を辞書で受け取る書き方を比べる。
- クラス変数とインスタンス変数の違い同じPython 3 エンジニア認定基礎試験の公式チュートリアルから、クラスの属性の扱いも確認する。
- append()とextend()の違い同じPython 3 エンジニア認定基礎試験の公式チュートリアルから、データ構造の扱いも確認する。
- Python3エンジニア認定基礎試験問題引数の指定の問題を横断して演習する。
同じ資格で次に知りたいこと
- jsonとpickleの違い|保存できる範囲と安全性をPython3エンジニア認定基礎試験で判断する
jsonとpickleの違いを、公式チュートリアル7.2.2が示す扱えるオブジェクトの範囲、他の言語との通信、信頼できないデータを読み込む危険性、dump()・dumps()・load()の使い分け、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- sort()とsorted()の違い|元のリストを変えるか新しいリストを返すかをPython3エンジニア認定基礎試験で判断する
list.sort()とsorted()の違いを、公式ドキュメントの記述、返り値の
None、渡せる対象、reverse引数、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。 - listとcollections.dequeの違い|スタックとキューの使い分けをPython3エンジニア認定基礎試験で判断する
listとcollections.dequeの違いを、公式チュートリアル5.1.1・5.1.2のスタックとキューの例、pop()とpopleft()の取り出し順、先頭の操作が低速な理由、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
よくある質問
Q位置専用引数とキーワード専用引数はどちらを使えばいい?
公式チュートリアルは、引数の名前をユーザーに知らせる必要がないなら位置専用引数、引数の名前に意味があり関数の定義がより明らかになる場合や引数の順番に縛られることを避けたい場合はキーワード専用引数を使うよう案内しています。
Q関数定義に/も*も無い場合、引数はどう渡せる?
位置でもキーワードでも渡せます。公式チュートリアルは、/と*はオプションだと説明しています。
QAPIで位置専用引数を使う理由は?
公式チュートリアルは、将来引数の名前が変更された場合にAPIの変更ができなくなることを防ぐために、位置専用引数を使うよう案内しています。
Q*argsの後ろに書いた引数は位置で渡せる?
渡せません。公式チュートリアル4.9.4は、*args引数の後にある仮引数はキーワード専用引数で、キーワード引数としてのみ使えると説明しています。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
