Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 'positional argument follows keyword argument' 오류 해결 방법

파이썬(Python)에서 함수에 값을 전달할 때는 위치 인수(positional argument)키워드 인수(keyword argument) 두 가지 방식을 사용할 수 있습니다. 다만 이 인수들은 반드시 정해진 순서에 따라 작성해야 하며, 순서를 어기면 파이썬 인터프리터가 오류를 반환합니다.

이번 글에서는 positional argument follows keyword argument(위치 인수가 키워드 인수 뒤에 위치함) 오류가 발생하는 이유를 살펴보고, 실제 코드 예제를 통해 해결 방법까지 단계별로 알아보겠습니다.

문제 상황: positional argument follows keyword argument

먼저 오류 메시지 전체를 확인해 보겠습니다.

SyntaxError: positional argument follows keyword argument

영어에 문법이 있듯이 프로그래밍 언어에도 각자 고유한 규칙이 있으며, 이를 문법(syntax)이라고 부릅니다. 위 오류는 문법 오류(SyntaxError)의 일종으로, 파이썬 코드를 작성할 때 지켜야 할 규칙 중 하나를 따르지 않았다는 의미입니다.

오류 메시지의 나머지 부분은 오류의 원인을 알려줍니다. 즉, 코드에서 키워드 인수 뒤에 위치 인수가 등장했다는 뜻입니다.

위치 인수란?

위치 인수는 말 그대로 자신의 위치에 맞게 값이 전달되는 인수입니다.

def add_numbers(a, b):
    return a + b

add_numbers(2, 3)

이 코드에서 "a"와 "b"는 함수 내부에서 변수로 사용됩니다. 두 개의 위치 인수를 지정했기 때문에 코드가 정상적으로 동작하며, "a"에는 2가, "b"에는 3이 할당됩니다.

같은 인수를 키워드 인수 형태로 전달할 수도 있습니다.

add_numbers(a=2, b=3)

하지만 먼저 위치 인수를 지정한 뒤 키워드 인수 문법으로 전환하는 것은 허용되지 않습니다.

원인은 바로 *args

그 이유는 파이썬에 여러 개의 인수를 처리하는 특수 문법인 *args가 존재하기 때문입니다. 다음 코드를 살펴보세요.

def show_users(a, b, *args):
    print(a, b, *args)

*args는 개수가 정해지지 않은 추가 인수들을 대표하는 문법입니다. 따라서 show_users() 함수에는 원하는 만큼 인수를 넘길 수 있습니다.

show_users("Alex", "Peter", "Violet", "Julie")

실행 결과는 다음과 같습니다.

Alex Peter Violet Julie

처음 두 인수인 "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라는 두 개의 인수를 받아, 샐러드 메뉴와 피자 메뉴의 항목을 하나씩 콘솔에 출력합니다.

이제 함수를 호출해 보겠습니다.

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

예상대로 코드에 오류가 발생했습니다. 이제 수정해 보겠습니다.

해결 방법

이 문제를 해결하려면 모든 위치 인수가 키워드 인수보다 앞에 오도록 코드를 작성해야 합니다. 이 규칙에 맞게 함수 호출 부분을 변경해 보겠습니다.

print_menu(salads, pizzas)

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

두 개의 파이썬 리스트가 성공적으로 출력되었습니다.

마무리

파이썬에서는 위치 인수가 반드시 키워드 인수보다 먼저 나와야 합니다. 파이썬은 위치 인수를 먼저 순서대로 해석한 후, 그다음에 지정된 키워드 인수를 해석하기 때문입니다.

이제 여러분도 전문 파이썬 개발자처럼 "positional argument follows keyword argument" 오류를 손쉽게 해결할 준비가 되었습니다!