用語比較
位置専用引数とキーワード専用引数の違い|/と*の位置をPython3エンジニア認定基礎試験で判断する
位置専用引数は/(スラッシュ)より前に置く引数で、キーワードで渡せません。キーワード専用引数は*より後に置く引数で、キーワード引数としてしか渡せません。公式チュートリアル4.9.3は、関数定義 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): を例に、/より前が位置専用、/と*の間が位置またはキーワード、*より後がキーワード専用と示しています。
Python 3 エンジニア認定基礎試験では、関数定義の/と*の位置を見て、ある呼び出し方がそのまま動くのかTypeErrorになるのかを判断させる問題が出ます。第4章「制御構造ツール」の引数の指定に当たる論点で、/と*の向きを取り違えると正反対の答えを選んでしまいます。
このページは、/と*を「引数の区切り記号」とだけ覚えている人を対象にしています。どちら側の引数がどの渡し方に制限されるかを、公式チュートリアルの関数の例と実際のエラーの文面で確認します。
この記事の目次
この記事の根拠と出典
本文の主要なセクションでは、公式一次資料と照合した内容と編集部の整理を、見出しの下のラベルで区別しています。 試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。
結論
位置専用引数
/より前に置く。引数の順序が重要で、キーワードで引数を渡せない。
キーワード専用引数
*より後に置く。キーワード引数として渡す必要がある。
違いを表で確認
| 比較軸 | 位置専用引数 | キーワード専用引数 |
|---|---|---|
| 目印の記号と置く位置 | /(スラッシュ)の前に置く | 最初のキーワード専用引数の直前に*を置く |
| 渡せる形 | 位置でだけ渡せる(キーワードでは渡せない) | キーワードでだけ渡せる(位置では渡せない) |
| 公式チュートリアルの例 | 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で将来の引数名の変更に備えるとき | 引数の名前に意味があり関数の定義がより明らかになるとき。引数の順番に縛られることを避けたいとき |
どこで迷っているかを切り分ける
/と*のどちらが「位置専用」なのか取り違える初学者
/の前が位置専用、*の後がキーワード専用です。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を位置で渡せません。公式チュートリアルでは takes 2 positional arguments but 3 were given というTypeErrorになります。
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'はキーワード引数のキーワードとして認識されると説明しています。
到達チェック
- /の前の引数が位置専用で、キーワードで渡せないと説明できる
- *の後の引数がキーワード専用で、キーワードで渡す必要があると説明できる
- /と*の間の引数が位置でもキーワードでも渡せると説明できる
- 公式チュートリアルが示す位置専用とキーワード専用の使い分けを挙げられる
関連ページで確認する
よくある質問
Q位置専用引数とキーワード専用引数はどちらを使えばいい?
公式チュートリアルは、引数の名前をユーザーに知らせる必要がないなら位置専用引数、引数の名前に意味があり関数の定義がより明らかになる場合や引数の順番に縛られることを避けたい場合はキーワード専用引数を使うよう案内しています。
Q関数定義に/も*も無い場合、引数はどう渡せる?
位置でもキーワードでも渡せます。公式チュートリアルは、/と*はオプションだと説明しています。
QAPIで位置専用引数を使う理由は?
公式チュートリアルは、将来引数の名前が変更された場合にAPIの変更ができなくなることを防ぐために、位置専用引数を使うよう案内しています。
Q*argsの後ろに書いた引数は位置で渡せる?
渡せません。公式チュートリアル4.9.4は、*args引数の後にある仮引数はキーワード専用引数で、キーワード引数としてのみ使えると説明しています。
執筆: ミナト編集部(運営者情報を見る)