[python] 기본이 아닌 인수가 기본 인수를 따를 수없는 이유는 무엇입니까?

이 코드 조각이 SyntaxError를 발생시키는 이유는 무엇입니까?

  >>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
...
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

다음 코드가 눈에 띄는 오류없이 실행되는 동안 :

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 



답변

모든 필수 매개 변수는 기본 인수 앞에 배치해야합니다. 기본 인수는 필수는 아니지만 필수이기 때문에 간단합니다. 구문 적으로, 혼합 모드가 허용 된 경우 인터프리터가 어떤 값이 어떤 인수와 일치하는지 결정하는 것은 불가능 합니다. SyntaxError인수가 올바른 순서로 제공되지 않으면 A 가 발생합니다.

함수를 사용하여 키워드 인수를 살펴 보겠습니다.

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

위와 같이 함수를 선언 할 수 있다고 가정하면 위의 선언으로 다음과 같은 (정규) 위치 또는 키워드 인수 호출을 수행 할 수 있습니다.

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

함수 호출에서 변수 할당을 제안하는 방법, 키워드 인수와 함께 기본 인수를 사용하는 방법.

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

참조 O’Reilly-Core-Python
이 함수는 기본 함수를 사용하여 위의 함수 호출에 대해 구문 상 올바른 것을 사용합니다. 키워드 인수 호출은 비 순차적 위치 인수를 제공하는 데 유용하지만 기본 인수와 함께 누락 된 인수를 “스킵”하는 데 사용될 수도 있습니다.


답변

SyntaxError: non-default argument follows default argument

이를 허용하면 기본이 아닌 인수는 뒤에 오기 때문에 기본값을 사용할 수 없으므로 기본 인수는 쓸모가 없게됩니다 .

그러나 Python 3에서는 다음을 수행 할 수 있습니다.

def fun1(a="who is you", b="True", *, x, y):
    pass

이 작업을 수행 할 수 있도록 브랜드 xy키워드 만

fun1(x=2, y=2)

더 이상 모호성이 없기 때문에 작동합니다. 여전히 할 수 없습니다 fun1(2, 2)(기본 인수를 설정합니다).


답변

여기서 두 가지 요점을 정리하겠습니다.

  • 먼저 기본이 아닌 인수는 기본 인수를 따라서는 안됩니다. 함수에서 매개 변수를 정의하는 순서는 다음과 같이 함수에서 (a = b, c)를 정의 할 수 없음을 의미합니다.
    • 위치 매개 변수 또는 기본이 아닌 매개 변수, 즉 (a, b, c)
    • 키워드 매개 변수 또는 기본 매개 변수 즉 (a = “b”, r = “j”)
    • 키워드 전용 매개 변수, 즉 (* args)
    • var-keyword 매개 변수, 즉 (** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(a, b)는 위치 매개 변수입니다

(c = 없음)은 선택적 매개 변수입니다.

(r = “w”)는 키워드 매개 변수입니다

(d = [])는 목록 매개 변수입니다.

(* ae)는 키워드 전용입니다

(** ab)는 var-keyword 매개 변수입니다.

  • 이제 다음과 같은 것을 시도하는 것이 보조입니다.
    def example(a, b, c=a,d=b):

기본값이 저장되면 인수가 정의되지 않습니다. 파이썬은 함수를 정의 할 때 기본값을 계산하고 저장합니다

c와 d는 정의되지 않았으며, 이런 일이 발생하면 존재하지 않습니다 (함수가 실행될 때만 존재합니다)

“a, a = b”는 매개 변수에서 허용되지 않습니다.


답변

클라이언트 코드가 두 개만 제공 할 수 있도록 필요한 인수 (기본값이없는 인수)가 시작에 있어야합니다. 선택적 인수가 시작된 경우 혼란 스러울 수 있습니다.

fun1("who is who", 3, "jack")

첫 번째 예에서 무엇을 할 것입니까? 마지막으로 x는 “who is who”이고, y는 3이고 a = “jack”입니다.


답변