AI資格ドリル
資格を選ぶ

用語比較

位置専用引数とキーワード専用引数の違い|/と*の位置を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

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

/と*のどちらが「位置専用」なのか取り違える初学者

/の前が位置専用、*の後がキーワード専用です。def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): の形で、左から順に位置専用、位置またはキーワード、キーワード専用と並ぶと覚えます。

02

引数名を書いて呼べば必ず通ると思っている人

位置専用引数はキーワードで引数を渡せません。公式チュートリアルの例では、pos_only_arg(arg=1) が TypeError(got some positional-only arguments passed as keyword arguments)になります。

03

*argsの後ろに書いた引数の扱いが分からない人

公式チュートリアル4.9.4は、*args引数の後にある仮引数はキーワード専用引数で、キーワード引数としてのみ使えると説明しています。def concat(*args, sep="/") では、sepを変えたいとき concat("earth", "mars", "venus", sep=".") のようにキーワードで渡し、'earth.mars.venus' が返ります。

問題文から答えを選ぶ手順

  1. 1

    関数定義に/と*があるか確認する

    どちらも無ければ、引数は位置またはキーワードで渡せます。/と*は省略できます。

  2. 2

    引数が/より前か確認する

    /より前の引数は位置専用です。呼び出し側で引数名=値の形になっていればTypeErrorです。

  3. 3

    引数が*(または*args)より後か確認する

    *より後の引数はキーワード専用です。呼び出しで位置引数として渡していれば、TypeErrorになります。

  4. 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'はキーワード引数のキーワードとして認識されると説明しています。

到達チェック

  • /の前の引数が位置専用で、キーワードで渡せないと説明できる
  • *の後の引数がキーワード専用で、キーワードで渡す必要があると説明できる
  • /と*の間の引数が位置でもキーワードでも渡せると説明できる
  • 公式チュートリアルが示す位置専用とキーワード専用の使い分けを挙げられる

同じ資格で次に知りたいこと

よくある質問

Q位置専用引数とキーワード専用引数はどちらを使えばいい?

A

公式チュートリアルは、引数の名前をユーザーに知らせる必要がないなら位置専用引数、引数の名前に意味があり関数の定義がより明らかになる場合や引数の順番に縛られることを避けたい場合はキーワード専用引数を使うよう案内しています。

Q関数定義に/も*も無い場合、引数はどう渡せる?

A

位置でもキーワードでも渡せます。公式チュートリアルは、/と*はオプションだと説明しています。

QAPIで位置専用引数を使う理由は?

A

公式チュートリアルは、将来引数の名前が変更された場合にAPIの変更ができなくなることを防ぐために、位置専用引数を使うよう案内しています。

Q*argsの後ろに書いた引数は位置で渡せる?

A

渡せません。公式チュートリアル4.9.4は、*args引数の後にある仮引数はキーワード専用引数で、キーワード引数としてのみ使えると説明しています。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)