디폴트 값이 있는 파라미터들이 먼저 오는 함수 foo를 선언해보자.

def foo(a="hello", b="how", c, d):
    print(a, b, c, d)

함수 fooc, d 값을 넘겨줄 목적으로 "are""you" 라는 argument를 넘겨서 호출해보자.

foo("are", "you")

결과는 ...

SyntaxError: non-default argument follows default argument

에러 메세지 내용을 읽어보면 non-default argumentdefault argument를 따라온다고 되어있다.
무슨 뜻이냐면 foo 함수를 선언할 때 디폴트 값이 있는 파라미터들을 먼저 선언했다는 뜻이다.

이게 뭐가 문제인지 자세히 살펴보자.
살펴 보기 전 기억해야할 내용이 있는데, 함수를 호출할 때 positional argument를 이용해 호출하는게 일반적인데, positional argument를 이용할 때 순서를 꼭 지켜줘야 한다.

foo("are", "you")

위와 같이 함수가 호출될 경우 파이썬은 c, d에 각각 "are""you"를 넘겨주려고 했던 나의 의도와는 다르게 여러가지 경우의 수를 두고 고민한다.

파이썬은 "are""you" 가 각각 a, b, c, d 중 어디에 저장되어야 하는지 알 수가 없다.
positional argument를 이용해서 호출했으니

ab에 각각 저장하라는 것인지,
ab는 디폴트 값이 선언되어 있으니 값이 없는 cd에 저장하라는 것인지
헷갈리게 된다.

이것을 방지하고자 파이썬에서는 함수를 선언할 때 디폴트값이 없는 파라미터부터 선언되어야 한다.
그렇지 않으면 아까와 같이 자동으로 선언될 때 부터 SyntaxError가 띄워진다.