Pythonの「positional argument follows keyword argument」エラーの原因と解決方法
Pythonでは、関数へ値を渡すための引数として「位置引数(ポジショナル引数)」と「キーワード引数」の2種類が用意されています。これらの引数は決められた順序で記述する必要があり、順序を守らないとPythonインタープリタがエラーを返します。
本記事では、「positional argument follows keyword argument(位置引数がキーワード引数の後に続いています)」というエラーが発生する理由と、その具体的な解決方法を解説します。エラーが発生するコード例をもとに、修正手順を一緒に確認していきましょう。
問題:「positional argument follows keyword argument」エラーとは
まず、エラーメッセージ全体を見てみましょう。
SyntaxError: positional argument follows keyword argument
自然言語に文法があるように、プログラミング言語にも独自のルールが存在します。このルールは「構文(シンタックス)」と呼ばれます。今回のエラーは構文エラー(SyntaxError)であり、Pythonのコードを書く際に守るべきルールの一つに従っていないことを意味しています。
エラーメッセージの続きの部分は、エラーの原因を示しています。この場合、コード内で「位置引数がキーワード引数の後に記述されている」ことが問題です。
位置引数とは
位置引数とは、渡す順序によって値が割り当てられる引数のことです。
def add_numbers(a, b):
return a + b
# 関数を呼び出す
add_numbers(2, 3)
このコードでは、「a」と「b」が関数内の変数として機能します。2つの位置引数を指定しているため正常に動作し、「a」には2が、「b」には3が代入されます。
同じ引数をキーワード引数として指定することも可能です。
add_numbers(a=2, b=3)
しかし、最初に位置引数を指定した後でキーワード引数の形式に切り替えることはできません。
*argsとの関係
このルールが存在する理由は、Pythonに可変長の引数を処理するための特別な仕組み「*args」があるためです。次のコードを見てください。
def show_users(a, b, *args):
print(a, b, *args)
このコードでは*argsを使用しています。*argsは任意の個数の追加引数を受け取れることを表します。そのため、show_users()関数には好きなだけ引数を渡せます。
show_users("Alex", "Peter", "Violet", "Julie")
実行結果は以下の通りです。
Alex Peter Violet Julie
最初の2つの引数「a」と「b」には、それぞれ「Alex」と「Peter」が割り当てられます。
これは、位置引数の形式を使う場合、引数が渡された順序どおりに値が割り当てられるためです。残りの引数は宣言された順序で処理されます。*argsは未知の個数の追加引数を表すからです。
エラーが発生する具体例
続いて、このエラーが発生するコード例を見てみましょう。
def print_menu(salads, pizzas):
print("Salad Menu")
for s in salads:
print(s)
print("")
print("Pizza Menu")
for p in pizzas:
print(p)
この関数は「salads(サラダ)」と「pizzas(ピザ)」の2つの引数を受け取ります。サラダメニューの各項目とピザメニューの各項目をコンソールに出力します。
それでは、この関数を呼び出してみましょう。
salads = ["Tuna Salad", "Lettuce and Mango Salad", "Greek Salad"] pizzas = ["Veggie Supreme", "Ham and Pineapple", "BBQ Chicken"] print_menu(pizzas=pizzas, salads)
実行すると、次のような結果になります。
File "main.py", line 13
print_menu(pizzas=pizzas, salads)
^
SyntaxError: positional argument follows keyword argument
予想どおり、コードにエラーが発生しました。ここで、キーワード引数「pizzas=pizzas」の後に位置引数「salads」が続いているため、エラーが出ています。次はこれを修正しましょう。
解決方法
この問題を解決するには、すべての位置引数をキーワード引数より前に配置する必要があります。このルールに従うよう、関数の呼び出し方を変更します。
print_menu(salads, pizzas)
これで2つの位置引数「salads」と「pizzas」を指定できました。あるいは、「salads」の後に「pizzas」をキーワード引数として指定することも可能です。
print_menu(salads, pizzas=pizzas)
この例では*argsを使用していないため、キーワード引数を追加する必要はありません。ただし、関数に渡す値が多い場合は、キーワード引数を使うことでコードの可読性が向上することもあります。
修正後の関数呼び出しでコードを実行してみましょう。
Salad Menu Tuna Salad Lettuce and Mango Salad Greek Salad Pizza Menu Veggie Supreme Ham and Pineapple BBQ Chicken
今度は、2つのPythonリストが正常に出力されました。
まとめ
Pythonでは、位置引数は必ずキーワード引数より前に記述しなければなりません。これは、Pythonがまず位置引数を出現順に解釈し、その後に指定されたキーワード引数を解釈するためです。
これであなたも、プロのPython開発者のように「positional argument follows keyword argument」エラーを解決できるはずです!
-
Pythonでコマンドライン引数を処理する3つの方法:sys.argv・getopt・argparseの使い方
どのプログラミング言語にも、スクリプトを作成してターミナルから実行したり、他のプログラムから呼び出したりする仕組みが用意されています。スクリプトを実行する際には、スクリプト内の各機能を実行するために必要な引数(パラメータ)を渡す場面がよくあります。本記事では、Pythonスクリプトへ引数を渡すための代表的な3つの方法、「sys.argv」「getopt」「argparse」について、サンプルコードと実行結果付きでわかりやすく解説します。 1. sys.argvを使う方法 Pythonの標準ライブラリであるsysモジュールに含まれるsys.argvは、スクリプトと一緒に渡された引数を取得できる最
-
Pythonのデフォルト引数とは?基本的な使い方をサンプルコードで解説
Pythonでは、関数の引数にデフォルト値(初期値)を設定できます。関数を呼び出す際にその引数が省略された場合、自動的にデフォルト値が適用される仕組みです。 デフォルト引数の基本 Pythonは、関数引数の構文やデフォルト値の扱い方において、他のプログラミング言語とは少し異なる独自のアプローチを採用しています。デフォルト値とは、関数呼び出し時に引数の値が渡されなかった場合に、その引数が取る値のことです。 デフォルト値は、代入演算子(=)を使って設定します。以下がデフォルト引数の典型的な構文です。この例では、foo パラメータに Come here! というデフォルト値が設定されています。 de