Python
 Computer >> コンピューター >  >> プログラミング >> Python

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」エラーを解決できるはずです!

  1. Pythonでコマンドライン引数を処理する3つの方法:sys.argv・getopt・argparseの使い方

    どのプログラミング言語にも、スクリプトを作成してターミナルから実行したり、他のプログラムから呼び出したりする仕組みが用意されています。スクリプトを実行する際には、スクリプト内の各機能を実行するために必要な引数(パラメータ)を渡す場面がよくあります。本記事では、Pythonスクリプトへ引数を渡すための代表的な3つの方法、「sys.argv」「getopt」「argparse」について、サンプルコードと実行結果付きでわかりやすく解説します。 1. sys.argvを使う方法 Pythonの標準ライブラリであるsysモジュールに含まれるsys.argvは、スクリプトと一緒に渡された引数を取得できる最

  2. Pythonのデフォルト引数とは?基本的な使い方をサンプルコードで解説

    Pythonでは、関数の引数にデフォルト値(初期値)を設定できます。関数を呼び出す際にその引数が省略された場合、自動的にデフォルト値が適用される仕組みです。 デフォルト引数の基本 Pythonは、関数引数の構文やデフォルト値の扱い方において、他のプログラミング言語とは少し異なる独自のアプローチを採用しています。デフォルト値とは、関数呼び出し時に引数の値が渡されなかった場合に、その引数が取る値のことです。 デフォルト値は、代入演算子(=)を使って設定します。以下がデフォルト引数の典型的な構文です。この例では、foo パラメータに Come here! というデフォルト値が設定されています。 de